web-dev-qa-db-ja.com

Firebase Android:onDataChange()イベントは常にメインUIスレッドで実行されますか?

Firebaseを使用するAndroidアプリケーションでは、Firebaseがクエリの回答を返したら、バックグラウンドで長い操作を実行する必要があります。例:

_query.addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot data) {
         dosomething very long. . .
         then call a callback forUI thread
   }
_

Firebaseがクエリを非同期モードで実行することは知っていますが、カスタムバックグラウンドスレッドでクエリを呼び出そうとしても、onDataChange()メソッドは常にメインUIスレッドで実行されるようです。

このユースケースを管理する方法を知っている人はいますか?

17
ThierryC

Firebaseリスナーのコールバックは、実際にメインUIスレッドで実行されます。

コールバックで重い操作を行う必要がある場合は、 AsyncTask を起動し、そこで作業を行います。 AsyncTask.doInBackground()メソッドは別のスレッドで実行されるため、Android UIをブロックしません。ただし、AsyncTask. onPostExecute()はメインスレッドで再度実行されるため、そこからUIビューを更新できます。

21

パーティーには少し遅すぎるかもしれませんが、Firebaseがバックグラウンドスレッドでコールbakcsを返すようにしたい場合は、BACKGROUN_EXECUTORからcom.google.firebase.firestore.util.Executors.BACKGROUND_EXECUTORを次のように使用できます。

.addOnCompleteListener(BACKGROUND_EXECUTOR, OnCompleteListener<Void> {
   ...
}

他にも次のような実行者がいます-

DEFAULT_CALLBACK_EXECUTOR
DIRECT_EXECUTOR 
0
Abhriya Roy