2016-06-23 39 views
0

から変数を変更し、私は次のコードを持っている:アクセスと内部匿名クラス

boolean gameSuccess = false; 
@Override 
    public boolean saveMission(final Mission mission) { 
     realm = Realm.getInstance(realmConfiguration); 

     realm.executeTransactionAsync(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
       realm.copyToRealm(mission); 
      } 
     }, new Realm.Transaction.OnSuccess() { 
      @Override 
      public void onSuccess() { 
       Log.d(TAG, "onSuccess: mission saved"); 
       realm.close(); 
       missionSuccess = true; 
      } 
     }, new Realm.Transaction.OnError() { 
      @Override 
      public void onError(Throwable error) { 
       Log.d(TAG, "onError: mission failed"); 
       realm.close(); 
       missionSuccess = false; 
      } 
     }); 
     return gameSuccess; 
    } 

gameSuccessがするonSuccessが呼び出された場合でも、常にfalseです。これを行う方法は何ですか?

+0

を遮断するトランザクションを変換する必要があるが、あなたはgameSuccessを返す前にOnSuccesが行われましたか? –

+0

は非同期です。それは戻り前または別のスレッドで発生します。すべてのコールバックが完了したら、値を返す方法を尋ねています。 – Kordova

答えて

0

Asyncがブロックされていないため、コードが間違っています。トランザクションは戻り前には発生しませんが、後で不特定の時間が発生するため、常にfalseです。

あなたはどちらかあなたのメソッドにコールバックを提供したり、

public void saveMission(final Mission mission, Callback callback) { 
    realm.executeTransactionAsync(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
       realm.copyToRealm(mission); 
      } 
     }, new Realm.Transaction.OnSuccess() { 
      @Override 
      public void onSuccess() { 
       Log.d(TAG, "onSuccess: mission saved"); 
       realm.close(); 
       callback.onSuccess(); 
      } 
     }, new Realm.Transaction.OnError() { 
      @Override 
      public void onError(Throwable error) { 
       Log.d(TAG, "onError: mission failed"); 
       realm.close(); 
       callback.onError(); 
      } 
     }); 
} 

または

realm.executeTransaction(...) 
+0

答えをありがとう。この変数の理由は、テストするだけです。 onSuccessがテストコールバックで元のメソッドを破壊することなく呼び出された場合、このメソッドをテストする方法は? – Kordova