为什么onPostExecute在AsyncTask中的doInBackground之前运行?

时间:2016-07-26 09:00:08

标签: android android-asynctask

当我调试我的应用程序时,我看到onPreExecute在onPreExecute之后启动,并且只有在完成doInBackground方法开始运行时才会启动,所以我在UI上没有结果。为什么会这样? AsyncTask代码:

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);
    }
}

2 个答案:

答案 0 :(得分: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);
    });
}

现在只需从您想要的地方调用此功能。

如果您在使用此解决方案时遇到任何问题,请与我们联系。

如果您可以使用此解决方案解决您的查询,请将此标记为答案。

快乐的编码!

答案 1 :(得分:0)

因为你没有使用注解,这意味着你将把提到的方法作为一个新方法来执行。以便正常执行它们。你必须在方法声明之前添加@Override。

<块引用>

@Override 注解在我们重写子类中的方法时使用。通常,新手开发人员会忽略此功能,因为在覆盖方法时不强制使用此注释。在这里我们将讨论为什么我们应该使用@Override 注解以及为什么它被认为是 Java 编码中的最佳实践。

先举个例子来了解一下它的用法,然后再详细讨论:

class ParentClass{
          public void displayMethod(String msg){
              System.out.println(msg);
                }
              }
   class SubClass extends ParentClass{
    @Override
    public void displayMethod(String msg){
            System.out.println("Message is: "+ msg);
            }
    public static void main(String args[]){
        SubClass obj = new SubClass();
        obj.displayMethod("Hey!!");
      }
 } 

here,如果需要,这里有简要信息