2017-06-19 4 views
0

以下のメソッドの順番で実行します。つまり、Aメソッドが終了すると、Bが開始されます。 Bが終わったらCが始まります。レルム非同期トランザクションAndroidの注文構造

public void InitializeAPI { 
    public static void init_A(Context mContext) { 
     Realm.init(mContext); 
     Realm realm = Realm.getDefaultInstance(); 
     realm.executeTransactionAsync(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
       // Some working is here. 
      } 
     }, new Realm.Transaction.OnSuccess() { 
      // Some proceesing lines are here. 
     }, new Realm.Transaction.OnError() { 
      Log.d("AsyncTransaction", "ERROR"); 
     }); 
     // And there are lots of other TransactionAsync() line in this methods. 
    } 
    public static void init_B(Context mContext) {...} 
    public static void init_C(Context mContext) {...} 
    // and So many initialize methods. 
} 

あなたが見ることができるように、私はinit_A(Context)を実行すると、非同期トランザクションは、バックグラウンドになります。

しかし、init_Bは、init_A終了後に実行する必要があります。 init_Cもあります。どうすればこの問題を設計できますか?もちろん

、私はinit_ARealm.Transaction.OnSuccess()init_Bを記述する場合、私はコードがメンテナンスにそのまま、または良くないだろうと思い、Realm.Transaction.OnSuccess()があることを知っているが。代わりに、非同期呼び出しの

realm.beginTransaction(); 

    //... add or update objects here ... 

realm.commitTransaction(); 

答えて

2

は、なぜこのようなものを使用しないでください。 これは、コードが同期して動作することを保証します。

希望することができます..!

+0

(残念ですが返信)しかし、クラス名「InitializeAPI」がわかるように、HTTPリクエストと解析コードがたくさんあります。それが非同期でない場合は、低性能(低速)ではありませんか? – TyeolRik

+0

約600件のリクエストがあります。 – TyeolRik

+1

RealM libのメソッド** executeTransactionAsync **のコードをチェックしようとすると、同じrealm.beginTransaction();を使用していることがわかります。 realm.commitTransaction(); yes 600は膨大な数値ですが、executeTransactionAsyncメソッドのコードを最初に確認してください。 (Ctrl +クリックして使用してください) –

1

OnSuccessのハンドラーからメッセージを送信して、init_Bをトリガーすることができます。しかし、それははるかに良く見えません。したがって、UIをブロックせずに初期化を行う場合は、独自のスレッドを作成することをお勧めします。

public void InitializeAPI { 
    public static void init_A(Context mContext) { 
     Realm.init(mContext); 
     Realm realm = Realm.getDefaultInstance(); 
     realm.beginTransaction(); 
     // Write data 
     realm.commitTransaction(); 
     realm.close(); 
    } 
    public static void init_B(Context mContext) {...} 
    public static void init_C(Context mContext) {...} 
    // and So many initialize methods. 
    public static void init() { 
     init_A(); 
     init_B(); 
     init_C(); 
     //... 
    } 
} 

Thread thread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     InitializeAPI.init(); 
     // Notify the main thread that initialization is done. 
     handler.post(initialziedRunnable); 
    } 
}); 
thread.start(); 
+0

実際、私は 'Handler'に慣れていませんので、もっと勉強します:)勉強してからコメントを追加してもいいですか? – TyeolRik

関連する問題