Java 返回语句之前如何从FirebaseFirestore获取所有数据
我需要一个函数从FirebaseFirestore获取所有数据/注释。 如何使此函数在返回之前等待所有数据 我认为我创建的这个函数在主线程中不起作用 并在从firebase获取数据之前返回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”)
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中运行良好。欢迎您,如果答案对您有帮助,请接受!谢谢,这对我帮助太多了。请接受它,这样对别人也有帮助。