AsyncTask连接超时不取消任务

时间:2015-03-26 06:55:07

标签: java android android-asynctask

我创建了一个简单的AsyncTask,如果需要超过3秒,我想要取消它。这是我在关注this post之后所做的事情:

异步来电

execTask = new StartParseDownload();
            execTask.execute();
            //new StartParseDownload(this).execute();
            Handler handler = new Handler();
            handler.postDelayed(new Runnable()
            {
              @Override
              public void run() {
                  if ( execTask.getStatus() == AsyncTask.Status.RUNNING )
                      execTask.cancel(true);
              }
            }, 300 );

任务:

public class StartParseDownload extends AsyncTask<String, Void, Boolean> {
        private ProgressDialog dialog;
        private boolean result = false;

        public StartParseDownload() {
        }

        protected void onPreExecute(){
        }

        @Override
        protected void onPostExecute(final Boolean success){

            super.onPostExecute(success);

        }

         @Override
            protected void onCancelled() {
                Log.e("Task cancelled", "Task cancelled");
            }

        protected Boolean doInBackground(final String... args){
            parObj.saveInBackground(new SaveCallback() {
                @Override
                public void done(com.parse.ParseException e){
                    if (e == null) {
                        result = true;
                        goIntoMainScreen();
                    } else {
                        result = false;
                    }

                    if (e != null) {
                    }
                }
            });
            return false;

        }
    }

我哪里错了?为什么onCancelled()没有被调用?

3 个答案:

答案 0 :(得分:0)

1.你的价值是300,而不是3000(3秒)

2.也可以查看:

if ( execTask.getStatus() == AsyncTask.Status.RUNNING ){ boolean s = execTask.cancel(true); Log.e("Taskcancelled", "Task cancelled " +s); }else{ Log.e("Taskcancelled", "Task cancelled already"); }

在致电取消之前,您的任务可能已经完成。

答案 1 :(得分:0)

在doinbackground中,您必须检查AsyncTask是否被取消。  您调用cancel但AsyncTask将继续运行,如果它仍处于dounbackground状态。完成后,onCancel被调用。也许在你的情况下它不会在3秒后被调用,因为你的doinbacground方法需要超过3秒......或者更快!

顺便说一下,我认为你的意思是运行3000而不是300的处理程序

答案 2 :(得分:0)

This回答可能会有所帮助。

文档说明了两种变体:

在API级别11中添加:

  

protected void onCancelled(结果结果)

     

在API级别11中添加   在cancel(boolean)之后在UI线程上运行   invoked和doInBackground(Object [])已经完成。

     

默认实现只是调用onCancelled()并忽略   结果。如果您编写自己的实现,请不要调用   super.onCancelled(结果)。

在API级别3中添加:

  

protected void onCancelled()

     

在API级别3中添加   应用程序应优先覆盖   onCancelled(对象)。默认情况下会调用此方法   onCancelled(Object)的实现。

     

在调用cancel(boolean)之后在UI线程上运行   doInBackground(Object [])已经完成。

我还没有对此进行过测试,但您可能希望尝试实施这两个覆盖:

   @Override
   protected void onCancelled() {
     Log.e("Task cancelled", "Task cancelled");
   }

   @Override
   protected void onCancelled(Boolean result) {
     Log.e("Task cancelled", "Task cancelled, result: " + result);
   }

记录cancel()的结果也可能有助于确保您成功取消AsyncTask。

if ( execTask.getStatus() == AsyncTask.Status.RUNNING ){
        boolean cancelled = execTask.cancel(true);
        if (cancelled){
           Log.d("cancel", "Task cancelled");
        }
        else{
           Log.e("cancel", "Task not cancelled");
        }
}