即使在调用cancel()并且doInBackground()完成后,onCancelled()也不会运行

时间:2014-12-23 14:19:09

标签: java android android-asynctask

我的AsyncTask课程出了问题。 我正在取消doInBackground()方法中的任务,并根据AsyncTask文档,onCancelled()在调用cancel()并且doInBackground完成时运行。

当我使用isCancelled()方法确认任务时,该任务已成功取消,但onCancelled()方法无法在其后运行。

来自AsyncTask documentation

protected void onCancelled ()

Applications should preferably override onCancelled(Object). 
This method is invoked by the default implementation of onCancelled(Object).

Runs on the UI thread after cancel(boolean) is invoked 
and doInBackground(Object[]) has finished.

这是我doInbackgroud()的代码(为简单起见,并未显示整个代码),

  protected String doInBackground(Void... params) {
    if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                        // do Something
                    } else {
                        mProgressDialog.dismiss();
                        Log.e("Status",isCancelled() + ", before cancel");
                        cancel(true);
                        Log.e("Status",isCancelled() + ", after cancel");
                    }
     return description.toString();
   }

这里是onCancelled()方法,

我试过了,

protected void onCancelled(String result) {
    Log.e("Status",isCancelled() + " oncancelled");
    Toast.makeText(c, "failed to load data !", Toast.LENGTH_LONG).show();
}

这个,

@Override
protected void onCancelled() {
    super.onCancelled();
    Log.e("Status",isCancelled() + " oncancelled");
    Toast.makeText(c, "failed to load data !", Toast.LENGTH_LONG).show();
}

这个,

@Override
protected void onCancelled(String result) {
    super.onCancelled();
    Log.e("Status",isCancelled() + " oncancelled");
    Toast.makeText(c, "failed to load data !", Toast.LENGTH_LONG).show();
}

if的{​​{1}}部分工作正常并运行doInbackground(),但是当满足onPostExecute()条件时,即使执行else方法,也不会执行onCancelled()方法任务成功取消。

这是Logcat条件的else输出。

false, before cancel
true, after cancel

确认任务已取消。

如果成功取消任务,为什么不执行onCancelled()方法。 ?

1 个答案:

答案 0 :(得分:1)

问题已解决,

问题是,doInBackground()方法返回String

return description.toString();

并且在String块内设置了if的值,但是当执行else块时,description.toString()的值未设置,因此保持{ {1}},导致null方法在执行doinBackground块时返回null值。 我不确定为什么它导致else方法不执行而不抛出任何错误或异常。

我在onCancelled()块内返回了另一个String,它解决了问题。

else