2017-12-18 168 views
0

我有一個改造請求,當我在onResponse中獲取數據時, 我在上面的代碼中稱爲繁重工作的文本視圖中插入了倍數,我從OnReponse得到結果,否則我會從數據庫中得到結果,所以問題是我在OnResponse和OnFailure中有相同的代碼,所以有任何方法可以將我繁重的工作放在改進之外,並等待響應只從OnResponse或OnFailure獲得一個結果?當數據準備就緒時,從改造的警報Mainthread

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。

public interface OKCallback { 
void onSuccess(String result); 

void onFailure(String result); 

}在方法啓動改造要求

然後,通過最終OKCallback okCallback這樣的..

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

感謝您的迴應,但重工仍然兩次! – stanly

+0

@現在檢查這個答案 –

0

你可以讓一個接口,讓回撥主線程或得到在的onSuccess API調用的響應後()或者onFailure處()開始新的AsynTask和處理在後臺請求。