【问题标题】:Android how to stop AsyncTask [duplicate]Android如何停止AsyncTask [重复]
【发布时间】:2014-05-19 09:42:45
【问题描述】:

我正在处理AsyncTask。 我正在尝试阻止AsyncTask

authenticationArrows mTask = new authenticationArrows(); 
mTask.execute();

我试图阻止它

mTask.cancel(true);

但它不会停止。

我的AsyncTask 代码如下。

class authenticationArrows extends AsyncTask<Void, Void, Boolean> 
{
    @Override
    protected void onCancelled() {
        super.onCancelled();

        cancel(true);

        // ask if user wants to try again
    }

     @Override
        protected Boolean doInBackground(Void... params) {
            return null;
        }
    protected void onPostExecute() {
    }

    @Override
    protected void onPreExecute() {

        if (!isCancelled()){
        handler.post(new Runnable() {

            @Override
            public void run() {
                centerImage.setVisibility(View.INVISIBLE);
                tiltMotion1.setVisibility(View.VISIBLE);                   

                progressStatus = 60;
                mProgressBar.setProgress(progressStatus);

                Vibrator v= (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                v.vibrate(200);
                progressStatus += 10;
                    mProgressBar.setProgress(progressStatus);                                                
            }
        });
        }
        if (!isCancelled()){
        handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                Motion1.setVisibility(View.INVISIBLE);
                Motion2.setVisibility(View.VISIBLE);
                Vibrator v= (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                v.vibrate(200);
                progressStatus += 10;
                mProgressBar.setProgress(progressStatus);
                startHandler();
            }
        }, 1000);
    }
    }

    public void startHandler(){
        if (!isCancelled()){
        handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                Motion2.setVisibility(View.INVISIBLE);
                Motion3.setVisibility(View.VISIBLE);
                Vibrator v= (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                v.vibrate(200);
                progressStatus += 10;
                mProgressBar.setProgress(progressStatus);
            }
        }, 1000);
        }
    }
}

导航到其他活动或应用程序进入后台时如何停止或取消它?

【问题讨论】:

  • 我相信你不能强行停止它,只要求它准备好时停止。
  • 您要停止异步任务还是要停止您创建的异步任务中的线程

标签: android android-asynctask


【解决方案1】:

cancel(...) 方法防止在 doInBackground() 完成后调用 onPostExecute()。相反 onCancelled() 将被调用。此外,isCancelled() 将在您调用 cancel() 后立即返回 true。您应该在 doInBackground() 中检查这一点,以便能够尽快完成。

所以,这是无用的代码:

@Override
protected void onCancelled() {
    super.onCancelled();
    cancel(true);
}

cancel(true) 在这里没有任何作用,因为 onCancelled() 只有在你之前调用 cancel() 时才会被调用。如果您的 AsyncTask 将被取消,您可以将其留空或处理此处的情况。

在这里你应该检查 isCancelled():

 @Override
 protected Boolean doInBackground(Void... params) {
     return null;
 }

因为你在这里什么都不做,所以你的 AsyncTask 没用,因为你根本不做后台线程。

这是调用 isCancelled() 的错误位置:

@Override
protected void onPreExecute() {

    if (!isCancelled()){
        ...
    }

同样,应该在 doInBackground() 中检查 isCancelled() 以使其尽快完成。

要通过切换活动或活动进入后台来取消您的任务,请使用onPause() 回调并调用mTask.cancel(true); 再次仔细阅读有关AsyncTask 的文档以了解基础知识。

【讨论】:

    【解决方案2】:

    事情没有停止的原因是进程 (doInBackground()) 一直运行到完成。因此,您应该在执行操作之前检查线程是否被取消:

    if(!isCancelled()){
    // Do your stuff
    }
    

    所以基本上,如果线程没有被取消,就去做,否则跳过它:) 在你的操作过程中检查这个可能很有用,特别是在花时间之前。

    另外,“清理”一点也很有用

    onCancelled();
    

    举例:

    protected Long doInBackground(URL... urls) {
    
         for (int i = 0; i < count; i++) {
          // you need to break your loop on particular condition here
    
             if(isCancelled())
                  break;             
         }
         return totalSize;
     }
    

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      您的 ProgressBar 是否设置为可取消的 false。

      在 mProgressBar.show() 之前添加动作监听器,如下所示:

      mProgressBar.setOnCancelListener(new DialogInterface.OnCancelListener(){
            public void onCancel(DialogInterface dialog) {
                mTask.cancel(true);
                //finish();
            }
      });
      

      【讨论】:

        猜你喜欢
        • 2014-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        相关资源
        最近更新 更多