2016-07-26 107 views
0

當我調試我的應用程序時,我看到onPostExecute在onPreExecute後啓動,並且只有在完成時doInBackground方法纔開始運行,所以我沒有UI上的結果。爲什麼會這樣?的AsyncTask代碼:爲什麼onPostExecute可以在AsyncTask的doInBackground之前運行?

class TranslateYandex extends AsyncTask<Void, Void, Void> { 
    String translate = ""; 
    //  YandexTranslation yandexTranslation; 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     enterWord.setEnabled(false); 
     getTranslateButton.setEnabled(false); 
     translate = enterWord.getText().toString(); 
    } 
    @Override 
    protected Void doInBackground(Void... voids) { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("https://translate.yandex.net") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     YandexService service = retrofit.create(YandexService.class); 

     Call<YandexTranslation> call = service.getTranslation(translate, API_KEY, LANG); 
     call.enqueue(new Callback<YandexTranslation>() { 
      @Override 
      public void onResponse(Call<YandexTranslation> call, Response<YandexTranslation> response) { 
       if (response.body() != null){ 
        Log.i("Response", response.body().getTranslation().get(0)); 
        translation = response.body().getTranslation().get(0); 
        int donothing = 1; 
       } 

       else { 
        Log.i("Response", " is null"); 
        } 
      } 

      @Override 
      public void onFailure(Call<YandexTranslation> call, Throwable t) { 
       Log.i("Failure", t.toString()); 
      } 
     }); 

     return null; 
    } 

    protected void onPostExecute(Void voids) { 
     enterWord.setEnabled(true); 
     getTranslateButton.setEnabled(true); 
     enterTranslation.setText(translation); 
    } 
} 
+3

因爲你在'doInBackground()'中做的事情本身就是異步的。也就是說,你不需要把它們放在'AsyncTask'中。 –

+0

您沒有在'onPostExecute'上放置'@ Override'註釋 –

+0

@KevinMurvie Java中不需要'@ Override'註解。簽名對於給定的類型參數是正確的。 –

回答

2

我覺得沒有必要使用異步任務簡單地創建像下面我已經證明了你會實現你想要的東西的方法。

public void methodName(){ 

    enterWord.setEnabled(false); 
    getTranslateButton.setEnabled(false); 
    translate = enterWord.getText().toString(); 

Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("https://translate.yandex.net") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
    YandexService service = retrofit.create(YandexService.class); 

    Call<YandexTranslation> call = service.getTranslation(translate, API_KEY, LANG); 
    call.enqueue(new Callback<YandexTranslation>() { 
     @Override 
     public void onResponse(Call<YandexTranslation> call, Response<YandexTranslation> response) { 
      if (response.body() != null){ 
       Log.i("Response", response.body().getTranslation().get(0)); 
       translation = response.body().getTranslation().get(0); 
       int donothing = 1; 
      } 

      else { 
       Log.i("Response", " is null"); 
       } 
     } 

     @Override 
     public void onFailure(Call<YandexTranslation> call, Throwable t) { 
      Log.i("Failure", t.toString()); 
     } 


     /* Here i am adding this code global because it seems you do not have any specific condition for translation object in onResponse. You can also write this in onResponse with specific condition*/ 
     enterWord.setEnabled(true); 
     getTranslateButton.setEnabled(true); 
     enterTranslation.setText(translation); 
    }); 
} 

現在只需從您想要的位置調用此函數。

讓我知道你是否面臨此解決方案的任何問題。

如果您可以通過此解決方案解決您的查詢,請將此標記爲答案。

快樂編碼!

+0

謝謝,它工作,但我已經將UI更新(最後3行)移動到call.enqueue的onResponse方法,因爲它是異步的,所以我需要在運行時禁用按鈕並在完成後更新。 –

+0

歡迎!如果您發現它有幫助,請將其標記爲答案,以便對面臨同類問題的其他開發人員有所幫助。 –

相關問題