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スレッドで実行されるようです。
このユースケースを管理する方法を知っている人はいますか?
Firebaseリスナーのコールバックは、実際にメインUIスレッドで実行されます。
コールバックで重い操作を行う必要がある場合は、 AsyncTask
を起動し、そこで作業を行います。 AsyncTask.doInBackground()
メソッドは別のスレッドで実行されるため、Android UIをブロックしません。ただし、AsyncTask. onPostExecute()
はメインスレッドで再度実行されるため、そこからUIビューを更新できます。
パーティーには少し遅すぎるかもしれませんが、Firebase
がバックグラウンドスレッドでコールbakcsを返すようにしたい場合は、BACKGROUN_EXECUTOR
からcom.google.firebase.firestore.util.Executors.BACKGROUND_EXECUTOR
を次のように使用できます。
.addOnCompleteListener(BACKGROUND_EXECUTOR, OnCompleteListener<Void> {
...
}
他にも次のような実行者がいます-
DEFAULT_CALLBACK_EXECUTOR
DIRECT_EXECUTOR