2017-12-18 5 views
0

私は、onResponseでデータを取得したときに改造要求を受けました 上記のコードでheavyworkと呼ばれるtextviewsに倍数挿入を行いました。そうでなければデータベースから結果が得られるので、OnResponseとOnFailureで同じコードを使用していたので、私の重い作業を改造の対象外にして、OnResponseまたはOnFailureからの結果を1つだけ返すようにする方法はありますか?アラートデータが準備されているときの改造からのメインスレッド

call.enqueue(new Callback<Dashboard>() { 
        @Override 
        public void onResponse(Call<Dashboard> call, Response<Dashboard> response) { 

         realm.beginTransaction(); 
         dashboard = realm.copyToRealmOrUpdate(response.body()); 
         realm.commitTransaction(); 

         // heavy work : insert in data in multiple text views 


        } 

        @Override 
        public void onFailure(Call<Dashboard> call, Throwable t) { 
         Log.e("error ", "" + t.getMessage()); 

         dashboard = realm.where(Dashboard.class).findFirst(); 
         // heavy work : insert in data in multiple text views 
        } 
       } 

答えて

0

のようにそれを変更することができます..Letの呼び出しそれOKCallbackインターフェースを作成します。任意のクラスまたは活性の最後そして改造要求を起動し、あなたの方法では、このような最終OKCallback okCallbackを通過

public interface OKCallback { 
void onSuccess(String result); 

void onFailure(String result); 

}

..

public void NetworkCall(final OKCallback okCallback){ 

........... 
call.enqueue(new Callback<Dashboard>() { 
      @Override 
      public void onResponse(Call<Dashboard> call, Response<Dashboard> response) { 

       realm.beginTransaction(); 
       dashboard = realm.copyToRealmOrUpdate(response.body()); 
       realm.commitTransaction(); 

       // heavy work : insert in data in multiple text views 
       okCallback.onSuccess(parcel); 

} 

単に(ActivityXがOKCallback実装)とそこにあなたの重い作業を行うことができるはずです。また、図のようにHandlerを使ってonSuccessメソッドでデータをラップすることもできます。

@Override 
public void onSuccess(String result) { 
    Handler handler = new Handler(ActivityX.this.getMainLooper()); 

    //process result and 
    handler.post(new Runnable() { 
     @Override 
     public void run() { 

      //heavy work done here will run on UI thread 
     } 
    }); 
} 
+0

ありがとう、私はそれをテストします、それは論理に見えます! – stanly

0

あなたはこの.. ファーストをお試しください。この

//create a interface 
    public interface ConfirmationCallback { 
      void onSuccess(YourResponseClass value); 
      void onError(); 
    } 

    //call this method from your class 
    yourApiCall(new ConfirmationCallback() { 
       @Override 
       public void onSuccess(YourResponseClass value) { 
        realm.beginTransaction(); 
        dashboard = realm.copyToRealmOrUpdate(value); 
        realm.commitTransaction(); 
        // heavy work : insert in data in multiple text views 
       } 

       @Override 
       public void onError() { 
        dashboard = realm.where(Dashboard.class).findFirst(); 
        // heavy work : insert in data in multiple text views 
       } 
      }); 


     public void yourApiCall(final ConfirmationCallback confirmationCallback){ 
      call.enqueue(new Callback<Dashboard>() { 
       @Override 
       public void onResponse(Call<Dashboard> call, Response<Dashboard> response) { 
        confirmationCallback.onSuccess(response.body()); 
       } 

       @Override 
       public void onFailure(Call<Dashboard> call, Throwable t) { 
        Log.e("error ", "" + t.getMessage()); 
        confirmationCallback.onError(); 
       } 
      } 
     } 
+0

応答にはありがたいですが、まだ重い作業が2回あります! – stanly

+0

@stanly今この回答を確認 –

0

はあなたがインターフェイスを作成し、メインスレッド上またはするonSuccessでのAPI呼び出しの応答を取得した後()またはONFAILUREにコールバックを得ることができます()新しいAsynTaskを開始し、バックグラウンドで要求を処理します。

関連する問題