java - 我想从 firebase 数据库获取数据对象,但 db Reference.addValueEventListener 将不会执行

标签 java android firebase firebase-realtime-database

private Firebase_Database DbOnline;
ArrayList<ClassModel> clsList;



clsList = DbOnline.getClassesList();//return arraylist containing objects ...





//Implementation of getClassesList() in Firebase_Database CLASS..

public ArrayList<ClassModel> getClassesList(){//upto to this every thing execute but from here the //execution jumps to if(condition) line below...and I get null arraylist in return

        FbDb.child("Classes").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for(DataSnapshot ds: dataSnapshot.getChildren())
                {
                    ClassModel classModel = ds.getValue(ClassModel.class);
                    classModels.add(classModel);
                    Log.i("Tag", "Msg");
                }
                Log.i("Tag", String.valueOf(classModels.size()));
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        if (classModels==null){
            Log.i("TAG","Null NO DATA IN DATABASE");
        }
        return classModels;
    }

最佳答案

Firebase 的操作是异步的。所以你必须等待才能获取数据。您可以使用 LiveData 并观察它以获取更新的内容。检查以下内容:

private MutableLiveData<ArrayList<ClassModel>> mutableClassModels = new MutableLiveData<>();
private ArrayList<ClassModel> classModels = new ArrayList<>();

public MutableLiveData<ArrayList<ClassModel>> getClassesList(){//upto to this every thing execute but from here the //execution jumps to if(condition) line below...and I get null arraylist in return

    FbDb.child("Classes").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for(DataSnapshot ds: dataSnapshot.getChildren())
            {
                ClassModel classModel = ds.getValue(ClassModel.class);
                classModels.add(classModel);
                Log.i("Tag", "Msg");
            }

            mutableClassModels.postValue(classModels);
            Log.i("Tag", String.valueOf(classModels.size()));
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

    return mutableClassModels;
}

然后像下面这样观察:

DbOnline.getClassesList().observe(this, new Observer<ArrayList<ClassModel>>() {
    @Override
    public void onChanged(ArrayList<ClassModel> classModels) {
        // Do your operation here
    }
});

更新:

如下更新您的适配器:

//Initialize it, as it causing NullPointerException
ArrayList<ClassModel> clsList = new ArrayList<>();

public Adapter(Context context, String name) {

    ...

    DbOnline=new Firebase_Database();
    if (fragName.equals(listForClasses)) {
        DbOnline.getClassesList().observe((LifecycleOwner) context, new Observer<ArrayList<ClassModel>>() {
            @Override
            public void onChanged(ArrayList<ClassModel> classModels) {
                clsList =classModels;
                clsList.size();

                //Notify to refresh the items
                notifyDataSetChanged();
            }
            });
    } else {
        sList = null;//DbOffline.getStudentsList("");
    }
}

关于java - 我想从 firebase 数据库获取数据对象,但 db Reference.addValueEventListener 将不会执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59491912/

相关文章:

javascript - 以编程方式在 Firebase 实时数据库中创建新路径?

Firebase 跨服务安全规则在应用程序中不起作用

Java - 将参数传递给 Main 方法

java - 记录事件的 SLF4J 版本

java - 在java中运行bat文件不起作用

Android Google Fit 实时计步

java - 使用支架和单独的线程在 Canvas 上绘图不会在屏幕上显示任何内容

node.js - 是否可以在 node.js 中运行 firebase 消息传递?

java - 既然jdbc是一个接口(interface),我们如何在jdbc中使用prepare语句

android - 从local.properties加载属性在Gradle Android Studio中不起作用