2016-07-26 3 views
0

私は私のアプリケーションをデバッグするときにonPostExecuteがonPreExecuteの後に始まり、終了したときだけdoInBackgroundメソッドが起動しているので、UIで結果が得られないことがわかります。それはなぜでしょうか? AsyncTaskコード:なぜAsyncTaskのdoInBackgroundより前にonPostExecuteを実行できますか?

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

ようこそ!あなたが有益であると分かった場合は、同じ種類の問題に直面する他の開発者に役立つように、親切に答えとしてマークしてください。 –

関連する問題