2017-10-01 3 views
0

現在、Firebase Realtime-Databaseにデータを保存しようとしています。RealTimeDatabaseの.setValueに対してOnCompleteListenerが呼び出されていません

databaseReference.child("someChild").setValue(someObject); 
Thread.sleep(1000); 

でデータを保存するだけで、これで問題はありません。オブジェクトがコンソールに表示され、すべてが機能します。しかし、よりスムーズな実装があった場合、私は疑問に思ったので、私はOnCompleteListener を使用しようとしましたし、次のコード働い:

final AtomicBoolean done = new AtomicBoolean(false); 

databaseReference.child("someChild") 
    .setValue(someObject) 
    .addOnCompleteListener(new OnCompleteListener<Void>() { 
      @Override 
      public void onComplete(@NonNull Task<Void> task) { 
       System.out.println("completed"); 
       done.set(true); 
      } 
     }); 

    while (!done.get()); 

ここでも、データがデータベースに正常に書き込まれているのが、onCompleteListenerは全く呼び出されませんしたがってwhile -loopは中断されません。

リスナーが呼び出されないのはなぜですか?私は他の設定もしましたが(while -loopなし)、これらは動作しませんでした。

ありがとうございます。

答えて

0

タイトループ(あなたが持っているwhileループ)は、メインスレッドをブロックしても、メインスレッド上で発生onCompleteを(呼び出しからFirebaseを維持します私の経験で。

ブロッキングを防止するために、postDelayedのようなものを使用:

final AtomicBoolean done = new AtomicBoolean(false); 

databaseReference.child("someChild") 
    .setValue(someObject) 
    .addOnCompleteListener(new OnCompleteListener<Void>() { 
     @Override 
     public void onComplete(@NonNull Task<Void> task) { 
      System.out.println("completed"); 
      done.set(true); 
     } 
    }); 

final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
    if (done.get()) { 
     ... Do the thing that requires the data 
    } 
    } 
}, 1000); 

またここに私の答えはSetting Singleton property value in Firebase Listener

+0

残念ながら問題を解決していない参照のことだった場合は、 'OnComplete'、リスナーがまだ(と呼ばれていません。 、私はSystemOutputでそれを見たでしょう) – cpt

+0

'AtomicBoolean'とそれを取り除くと、' onComplete() 'が呼び出されますか?その場合、削除したコードが 'onComplete()'の呼び出しをブロックしていることが明らかです。 –

+0

「AtomicBoolean」が本当に問題であることが判明しました。ご協力いただきありがとうございます! – cpt

関連する問題