2016-11-20 44 views
0

私はFirebaseを使用しています。私の問題は、私はオブジェクトを照会し、それらを変更している間、私の主なUIスレッドは先に進んで、次のメソッドを実行しています。私は私のfirebaseのクエリが終了し、私はonDataChangeのすべての必要な変更を行い、私は書かれた私の他の関数を実行し続けるまで私のメインのUIスレッドを待つ必要があります。クエリが終了したときにメソッドを実行するには?

現在、私は外部ライブラリ「Otto」をインポートしましたが、使用方法がわからず、誰かが私を導くのを助けることを望んでいました。

   Firebase cardReference = mRef.child("reference"); 
       cardReference.addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
        //DO STUFF 
        } 
        @Override 
        public void onCancelled(FirebaseError firebaseError) { 

        } 
       }); 
       //Once STUFF is done, run nextMethod() 
       nextMethod(); 
     } 
+0

は、なぜあなたはものを編集した後、 '' OnDataChangeの 'で'にNextMethodを()を使用いけない 'Otto'があります?オペレーションのためのpub-sub。 – adnbsr

答えて

0

Firebaseはデータベースから非同期にデータを読み取ります。ユーザーに「アプリケーションが応答していません」と表示されることなく、アプリケーションを待機させる方法はありません。

代わりにロジックを書き直す必要があります。 「最初に参照をロードしてから次のメソッドを実行する」と言うのではなく、「次のメソッドを実行するときにリファレンスをロードする」に変更します。変換コードで:

Firebase cardReference = mRef.child("reference"); 
cardReference.addValueEventListener(new ValueEventListener() { 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     // Whenever STUFF is done, run nextMethod() 
     nextMethod(); 
    } 
    public void onCancelled(FirebaseError firebaseError) { 
     throw firebaseError.toException(); 
    } 
}); 

このアプローチのさらなる利点はnextMethod()が今もたびに、基準データの変更と呼ぶことにすることです。このような場合にUIを更新することは、ユーザーが気付いた後にユーザーが感謝する特別な効果の1つです。いくつかの詳細については

、またこれらをお読みください。

関連する問題