从addValueEventListener Firebase中检索字符串

时间:2017-02-09 15:31:27

标签: android string firebase firebase-realtime-database

我想从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;

4 个答案:

答案 0 :(得分:5)

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

解决方案是重新构建你的问题&#34;首先得到对象,然后用标题&#34;做blabla。到&#34;开始得到对象;一旦对象可用,请使用标题&#34;来进行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,因为他们都以这种方式工作)不熟悉这个问题。所以我建议你也查看他们的问题和答案:

答案 1 :(得分:0)

这是一个有效的技巧。如果您需要从ValueEventListener检索的数据较少,则这样做很容易。 在onDataChange()中,使用setText在其中设置所需的值。将此文本视图的可见性保持为“ Gone”。然后在ValueEventListener外部使用getText进行检索。 我知道这不是确切的答案,但是可以解决问题:)

答案 2 :(得分:0)

为了在视图模型或任何其他网络调用中从方法addValueEventListener中检索字符串,建议使用MutableLiveData<T>LiveData<T>并在您的活动中进行观察。观察者将观察这些变化,一旦字符串填满,观察者方法将自动为您提供您要查找的字符串。

您需要为LiveData<T> reference_variable所在的addValueEventLister创建参考变量,并将其值设置在addValueEventListener中。

然后在您的viewmodel中创建返回值函数,如下所示... 在您的活动中观察此功能,您将获得字符串。

public MutableLiveData<TotalRunsWicketsAndData> getDisplayableDetails() {
        return observableLiveData;
 }

我在这里使用MutableLiveData

答案 3 :(得分:-1)

您可以使用 GenericTypeIndicator 检索整个列表。按照here

上的官方指南进行操作