Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回语句之前如何从FirebaseFirestore获取所有数据_Java_Android_Firebase_Android Asynctask_Google Cloud Firestore - Fatal编程技术网

Java 返回语句之前如何从FirebaseFirestore获取所有数据

Java 返回语句之前如何从FirebaseFirestore获取所有数据,java,android,firebase,android-asynctask,google-cloud-firestore,Java,Android,Firebase,Android Asynctask,Google Cloud Firestore,我需要一个函数从FirebaseFirestore获取所有数据/注释。 如何使此函数在返回之前等待所有数据 我认为我创建的这个函数在主线程中不起作用 并在从firebase获取数据之前返回 publicstaticarraylistgetnotes(){ FirebaseFirestore db=FirebaseFirestore.getInstance(); 最终字符串标记=“FB适配器”; 最终ArrayList doFBs=新ArrayList(); 数据库集合(“notesItem”)

我需要一个函数从FirebaseFirestore获取所有数据/注释。 如何使此函数在返回之前等待所有数据

我认为我创建的这个函数在主线程中不起作用 并在从firebase获取数据之前返回

publicstaticarraylistgetnotes(){
FirebaseFirestore db=FirebaseFirestore.getInstance();
最终字符串标记=“FB适配器”;
最终ArrayList doFBs=新ArrayList();
数据库集合(“notesItem”)
.get()
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
对于(QueryDocumentSnapshot文档:task.getResult()){
Log.d(标记,document.getId()+“=>”+document.getData());
add(document.toObject(NoteFB.class));
}
}否则{
Log.w(标记“获取文档时出错”,task.getException());
}
}
});
返回doFBs;
}
MyFBAdapter MyFBAdapter=新的MyFBAdapter(ShowActivity.this,FBAdapter.getNotes());
rvContacts.setAdapter(myFBAdapter);

这段代码返回一个空的ArrayList,创建一个空的recyclerview。

最近出现了很多这样的问题。不久前我找到了解决方案:使用Tasks API

public static ArrayList<NoteFB> getNotes() {

    FirebaseFirestore db = FirebaseFirestore.getInstance();
    final String TAG = "FB Adapter";

    final ArrayList<NoteFB> doFBs = new ArrayList<>();

    try {
        Task<QuerySnapshot> taskResult = Tasks.await(db.collection("notesItem").get(), 2, TimeUnit.SECONDS)
        for (QueryDocumentSnapshot document : task.getResult()) {
            Log.d(TAG, document.getId() + " => " + document.getData());
            doFBs.add(document.toObject(NoteFB.class));
         }

    } catch(Exception e) {
         Log.w(TAG, "Error getting documents.", e.localizedString());
    }
    return doFBs
}
publicstaticarraylistgetnotes(){
FirebaseFirestore db=FirebaseFirestore.getInstance();
最终字符串标记=“FB适配器”;
最终ArrayList doFBs=新ArrayList();
试一试{
Task taskResult=Tasks.await(db.collection(“notesItem”).get(),2,TimeUnit.SECONDS)
对于(QueryDocumentSnapshot文档:task.getResult()){
Log.d(标记,document.getId()+“=>”+document.getData());
add(document.toObject(NoteFB.class));
}
}捕获(例外e){
w(标记“获取文档时出错”,例如localizedString());
}
返回doFBs
}
如果我犯了语法错误,请原谅,我的Java有点生疏了


确保您正在从主线程调用此代码,否则它将崩溃。

您可以使用此接口

public interface NoteDataInterface {
        void onCompleted(ArrayList<NoteFB> listNotes);
    }
公共接口NoteDataInterface{
未完成的作废(ArrayList listNotes);
}
将您的方法更改为使用界面:

 public static void getNotes(NoteDataInterface noteDataInterface) {

        FirebaseFirestore db = FirebaseFirestore.getInstance();
        final String TAG = "FB Adapter";

        final ArrayList<NoteFB> doFBs = new ArrayList<>();
        db.collection("notesItem")
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot document : task.getResult()) {
                                Log.d(TAG, document.getId() + " => " + document.getData());
                                doFBs.add(document.toObject(NoteFB.class));
                            }
                        } else {
                            Log.w(TAG, "Error getting documents.", task.getException());
                        }
                       noteDataInterface.onCompleted(doFBs);
                    }
                });


    }
publicstaticvoidgetnotes(NoteDataInterface-NoteDataInterface){
FirebaseFirestore db=FirebaseFirestore.getInstance();
最终字符串标记=“FB适配器”;
最终ArrayList doFBs=新ArrayList();
数据库集合(“notesItem”)
.get()
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
对于(QueryDocumentSnapshot文档:task.getResult()){
Log.d(标记,document.getId()+“=>”+document.getData());
add(document.toObject(NoteFB.class));
}
}否则{
Log.w(标记“获取文档时出错”,task.getException());
}
noteDataInterface.onCompleted(doFBs);
}
});
}
然后调用您的方法:

 getNoteData(new NoteDataInterface() {
            @Override
            public void onCompleted(ArrayList<NoteFB> listNotes) {
                Log.e("listNotes>>",listNotes.size()+"");
            }
        });
getNoteData(新的NoteDataInterface(){
@凌驾
未完成公共作废(ArrayList listNotes){
Log.e(“listNotes>>”,listNotes.size()+“”);
}
});

Hi。看起来这段代码来自一个更大的应用程序;例如,调用
getNotes()
的上下文是什么?我建议对建议进行审查,以便作出决定。你的问题也很难理解,因为它的书写方式。嗨@ScottMcPeak谢谢你的评论。。我试着制作todo/notes应用程序,它是从firebase插入和获取数据的,我试着制作firebase适配器,像sqlite适配器一样,但它的静态函数可以在任何地方使用它,当我调用getNotes()函数时,它的返回空arraylist,我跟踪了代码,我发现数据来自getNote()的返回语句列表之后23:43:56.028来自firebase 23:43:58.834的数据,我如何让函数等待所有数据后返回。非常感谢,这在AsyncTask中运行良好。欢迎您,如果答案对您有帮助,请接受!谢谢,这对我帮助太多了。请接受它,这样对别人也有帮助。