Java whereEqualTo/snapshot侦听器是否在后台线程上运行?

Java whereEqualTo/snapshot侦听器是否在后台线程上运行?,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我正在创建一个日志应用程序。我试图获取当前用户的日志条目,然后将其转换为日志对象,该对象将被放入日志列表中。最终,此日志列表将发送到RecyclerView适配器 我在onCreate()中有这段代码: 在onEvent块中(但仍在onCreate()中),日志仍被发送到firebase,但在添加第二篇文章之前,似乎不会调用RecycleServiceAdapter 我的猜测是,要么Android Studio跳过onEvent()块并继续运行(可能会将其放入队列中,因为它知道它需要时间来执行)

我正在创建一个日志应用程序。我试图获取当前用户的日志条目,然后将其转换为日志对象,该对象将被放入日志列表中。最终,此日志列表将发送到RecyclerView适配器

我在
onCreate()
中有这段代码:

onEvent
块中(但仍在onCreate()中),日志仍被发送到firebase,但在添加第二篇文章之前,似乎不会调用RecycleServiceAdapter

我的猜测是,要么Android Studio跳过onEvent()块并继续运行(可能会将其放入队列中,因为它知道它需要时间来执行),要么它在适配器部分首先完成的后台线程上运行。无论哪种方式,都会向Firestore发送一个空的日志数组列表

但是,我不确定这些场景中的哪一个实际发生了。如果有人能证实,我将不胜感激。谢谢

更新: 不起作用的代码:

myCollection.whereEqualTo("userId", userId).addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable @org.jetbrains.annotations.Nullable QuerySnapshot value, @Nullable @org.jetbrains.annotations.Nullable FirebaseFirestoreException error) {
                for(QueryDocumentSnapshot snapshot : value){
                    Journal myJournal = snapshot.toObject(Journal.class);
                    journals.add(myJournal);



                }
            }
        });

        
        RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(journals, JournalList.this);
        recyclerView.setAdapter(myAdapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(JournalList.this));
        myAdapter.notifyDataSetChanged();
myCollection.whereEqualTo(“userId”,userId).addSnapshotListener(新的EventListener()){
@凌驾
public void onEvent(@Nullable@org.jetbrains.annotations.Nullable QuerySnapshot value,@Nullable@org.jetbrains.annotations.Nullable FirebaseFirestoreException错误){
for(QueryDocumentSnapshot快照:值){
Journal myJournal=snapshot.toObject(Journal.class);
日记账。添加(myJournal);
}
}
});
RecycleServiceAdapter myAdapter=新的RecycleServiceAdapter(日记,JournalList.this);
recyclerView.setAdapter(myAdapter);
setLayoutManager(新的LinearLayoutManager(JournalList.this));
myAdapter.notifyDataSetChanged();
JournalList.java的完整代码(如果需要):

导入android.content.Intent;
导入android.os.Bundle;
导入android.view.Menu;
导入android.view.MenuItem;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.appcompat.app.appcompat活动;
导入androidx.appcompat.widget.Toolbar;
导入androidx.recyclerview.widget.LinearLayoutManager;
导入androidx.recyclerview.widget.recyclerview;
导入com.google.firebase.auth.FirebaseAuth;
导入com.google.firebase.auth.FirebaseUser;
导入com.google.firebase.firestore.CollectionReference;
导入com.google.firebase.firestore.EventListener;
导入com.google.firebase.firestore.FirebaseFirestore;
导入com.google.firebase.firestore.FirebaseFirestoreException;
导入com.google.firebase.firestore.QueryDocumentSnapshot;
导入com.google.firebase.firestore.QuerySnapshot;
导入java.util.ArrayList;
导入java.util.List;
公共类日志列表扩展了AppCompatActivity{
私人回收站;
私有FirebaseFirestore db=FirebaseFirestore.getInstance();
私人收藏参考myCollection=db.collection(“日记账”);
私有FirebaseAuth FirebaseAuth;
私有FirebaseUser当前用户;
私人名单期刊;
私人工具栏;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u journal\u list);
recyclerView=findViewById(R.id.recyclerView);
firebaseAuth=firebaseAuth.getInstance();
currentUser=firebaseAuth.getCurrentUser();
字符串userId=currentUser.getUid();
myToolbar=findviewbyd(R.id.my_toolbar);
日记账=新的ArrayList();
设置支持操作栏(myToolbar);
myCollection.whereEqualTo(“userId”,userId).addSnapshotListener(新的EventListener()){
@凌驾
public void onEvent(@Nullable@org.jetbrains.annotations.Nullable QuerySnapshot value,@Nullable@org.jetbrains.annotations.Nullable FirebaseFirestoreException错误){
for(QueryDocumentSnapshot快照:值){
Journal myJournal=snapshot.toObject(Journal.class);
日记账。添加(myJournal);
}
}
});
//我猜:
RecycleServiceAdapter myAdapter=新的RecycleServiceAdapter(日记,JournalList.this);
recyclerView.setAdapter(myAdapter);
setLayoutManager(新的LinearLayoutManager(JournalList.this));
myAdapter.notifyDataSetChanged();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.menu,menu);
返回super.onCreateOptions菜单(菜单);
}
@凌驾
公共布尔值OnOptionItemSelected(@NonNull MenuItem item){
开关(item.getItemId()){
案例R.id.add注:
startActivity(新意图(JournalList.this,PostJournalActivity.class));
打破
案例R.id.注销:
firebaseAuth.signOut();
startActivity(新意图(JournalList.this,MainActivity.class));
打破
}
返回super.onOptionsItemSelected(项目);
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
}
}

网络请求etc在后台线程上运行,但回调不运行

然而,我认为您的误解来自回调的工作方式。当您在此处传入一个
EventListener
时,您传入的是一个类(在本例中是一个匿名类),该类重写了
onEvent
方法。正如你所说,没有什么可以“跳过”的

让我们考虑一个例子。假设我定义了一个接口
回调

interface Callback {

    void myMethod();
}
然后我可以编写一个冗余方法:

void doSomethingWith(Callback myCallback) {

    myCallback.myMethod();
}
现在在这里,当我打电话的时候

doSomethingWith(new Callback() {
    @Override
    public void myMethod() {
        
        // ...
    }
});

doSomethingElse();
myMethod
的实现在
doSomethingElse
之前运行

但是,不一定要这样。假设我定义了
doSomethingWith
,如下所示:

void doSomethingWith(Callback myCallback) {

    // Do nothing
}
void doSomethingWith(Callback myCallback) {

    // Switch to a background thread,
    // wait for a network request then call myCallback.myMethod()
}
Th
doSomethingWith(new Callback() {
    @Override
    public void myMethod() {
        
        // ...
    }
});

doSomethingElse();
void doSomethingWith(Callback myCallback) {

    // Do nothing
}
void doSomethingWith(Callback myCallback) {

    // Switch to a background thread,
    // wait for a network request then call myCallback.myMethod()
}
RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(journals, JournalList.this);
recyclerView.setAdapter(myAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(JournalList.this));

myCollection...addSnapshotListener(new EventListener<QuerySnapshot>() {
    @Override
    public void onEvent(...) {

        myAdapter.data = ...
        myAdapter.notifyDataSetChanged();
    }
});