从addValueEventListener Firebase中检索字符串(Retrieve String out of addValueEventListener Firebase)

编程入门 行业动态 更新时间:2024-10-20 07:46:35
从addValueEventListener Firebase中检索字符串(Retrieve String out of addValueEventListener Firebase)

我想从addValueEventListener()方法接收一个字符串,我用它来addValueEventListener()数据库Firebase中的数据。 数据正确到达。

但是当确定从该方法中获取字符串以在另一个方法中使用它时,它什么也不返回。

你有提示吗?

我已经尝试了putExtras并且还有意创建了一个方法,但它没有用。

final DatabaseReference mPostReference = FirebaseDatabase.getInstance().getReference().child("user-daily").child(getUid()).child("2017-Year"); mPostReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { final ArrayList<String> labels = new ArrayList<String>(); for (DataSnapshot data : dataSnapshot.getChildren()){ final DailyItem dailyItem = data.getValue(DailyItem.class); labels.add(dailyItem.mese); } title.setText(labels.get(position)); a = title.getText().toString(); } @Override public void onCancelled(DatabaseError databaseError) { Toast.makeText(view.getContext(),"database error", Toast.LENGTH_SHORT).show(); } }); //this return null... why? String title = a;

I want to receive a string from addValueEventListener() method I use to resell the data from the database Firebase. The data arrive correctly.

But when certain to get the string out of that method to use it in another, it returns nothing.

You have tips?

I already tried putExtras and also create a method on purpose but it did not work.

final DatabaseReference mPostReference = FirebaseDatabase.getInstance().getReference().child("user-daily").child(getUid()).child("2017-Year"); mPostReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { final ArrayList<String> labels = new ArrayList<String>(); for (DataSnapshot data : dataSnapshot.getChildren()){ final DailyItem dailyItem = data.getValue(DailyItem.class); labels.add(dailyItem.mese); } title.setText(labels.get(position)); a = title.getText().toString(); } @Override public void onCancelled(DatabaseError databaseError) { Toast.makeText(view.getContext(),"database error", Toast.LENGTH_SHORT).show(); } }); //this return null... why? String title = a;

最满意答案

数据是从Firebase异步加载的。 当你运行title = a ,尚未调用onDataChange方法。 在调试器中设置一些断点来验证这一点,这是理解异步加载如何工作的关键。

解决方案是重新解决你的问题,从“首先得到对象,然后用标题做blabla”到“开始获取对象;一旦对象可用,用标题做blabla”。

在代码中,这转换为:

final DatabaseReference mPostReference = FirebaseDatabase.getInstance().getReference().child("user-daily").child(getUid()).child("2017-Year"); mPostReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { final ArrayList<String> labels = new ArrayList<String>(); for (DataSnapshot data : dataSnapshot.getChildren()){ final DailyItem dailyItem = data.getValue(DailyItem.class); labels.add(dailyItem.mese); } title.setText(labels.get(position)); // Do blabla with the title String title = title.getText().toString(); } @Override public void onCancelled(DatabaseError databaseError) { Toast.makeText(view.getContext(),"database error", Toast.LENGTH_SHORT).show(); } });

许多开发人员对Firebase(以及其他现代Web API,因为他们都以这种方式工作)不熟悉这个问题。 所以我建议你也看看他们的问题和答案:

无法访问set之外的firebaseObjectObservable Android Firebase获取没有DataChange的子级值 在ValueEventListener中初始化全局变量后,将重置该值 无法从ondatachange方法中获取值 ArrayList不在onChildAdded函数内更新 在Firebase侦听器中设置Singleton属性值 此搜索结果列表中的大多数其他人

The data is loaded from Firebase asynchronously. By the time you run title = a, the onDataChange method hasn't been called yet. Set some breakpoints in a debugger to verify this, it's key to understanding how asynchronous loading works.

The solution is to reframe your problem from "first get the object, then do blabla with the title" to "start getting the object; once the object is available, do blabla with the title".

In code this translates to:

final DatabaseReference mPostReference = FirebaseDatabase.getInstance().getReference().child("user-daily").child(getUid()).child("2017-Year"); mPostReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { final ArrayList<String> labels = new ArrayList<String>(); for (DataSnapshot data : dataSnapshot.getChildren()){ final DailyItem dailyItem = data.getValue(DailyItem.class); labels.add(dailyItem.mese); } title.setText(labels.get(position)); // Do blabla with the title String title = title.getText().toString(); } @Override public void onCancelled(DatabaseError databaseError) { Toast.makeText(view.getContext(),"database error", Toast.LENGTH_SHORT).show(); } });

Many developers new to Firebase (and other modern web APIs, as they all work this way) struggle with this problem. So I recommend you also check out their questions and answers:

Cannot access firebaseObjectObservable outside of set Android Firebase get value of child without DataChange Value of a global variable is reset after it is initialised in ValueEventListener can't get values out of ondatachange method ArrayList not updating inside onChildAdded function Setting Singleton property value in Firebase Listener and most others in this list of search results

更多推荐

本文发布于:2023-08-04 12:33:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1415981.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字符串   Firebase   addValueEventListener   Retrieve   String

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!