Firebase Android:onDataChange()事件总是在主UI线程中执行?

Thi*_*ryC 17 android firebase firebase-realtime-database

在使用Firebase的Android应用程序中,一旦Firebase返回查询答案,我需要在后台执行长时间操作.例如:

query.addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot data) {
         dosomething very long. . .
         then call a callback forUI thread
   }
Run Code Online (Sandbox Code Playgroud)

我知道firebase在异步模式下执行查询,但该onDataChange()方法似乎总是在主UI线程中执行,即使我尝试在自定义后台线程中调用查询.

有谁知道如何管理这个用例?

Fra*_*len 21

Firebase侦听器的回调确实在主UI线程上执行.

如果你需要在回调中进行繁重的操作,请启动AsyncTask并在那里完成工作.该AsyncTask.doInBackground()方法在不同的线程上执行,因此它不会阻止Android UI.但是AsyncTask. onPostExecute()再次在主线程上执行,因此您可以从那里更新UI视图.

  • 有没有办法将线程设置为您想要获得回调操作的位置? (11认同)

Abh*_*Roy 6

参加聚会可能有点晚了,但是如果您想Firebase在后台线程上返回回调,则可以使用BACKGROUND_EXECUTORfrom 之com.google.firebase.firestore.util.Executors.BACKGROUND_EXECUTOR类的

.addOnCompleteListener(BACKGROUND_EXECUTOR, OnCompleteListener<Void> {
   ...
}
Run Code Online (Sandbox Code Playgroud)

还有其他执行者,例如 -

DEFAULT_CALLBACK_EXECUTOR
DIRECT_EXECUTOR 
Run Code Online (Sandbox Code Playgroud)

  • 这也适用于实时数据库吗?这就是问题所在(当被问到这个问题时,Firestore 甚至还不存在)。 (3认同)