Android如何停止AsyncTask

时间:2014-05-19 09:42:45

标签: android android-asynctask

我正在研究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);
        }
    }
}

如何导航到其他活动或App转到后台时如何停止或取消?

3 个答案:

答案 0 :(得分:1)

{1}}方法阻止在doInBackground()完成后调用onPostExecute()。而是将调用onCancelled()。此外,只要您调用cancel(),cancel(...)将返回true。您应该在doInBackground()中检查这一点,以便尽快完成。

所以,这是无用的代码:

isCancelled()

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

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

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

因为你在这里什么都不做,所以AsyncTask没用,因为你根本就没有背景线程。

这是调用isCancelled()的错误地方:

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

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

要通过切换活动或活动转到后台取消您的任务,请使用@Override protected void onPreExecute() { if (!isCancelled()){ ... } 回调并致电onPause() 请仔细阅读有关AsyncTask的文档以获取基础知识。

答案 1 :(得分:0)

事情没有停止的原因是因为进程(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;
 }

希望这有帮助!

答案 2 :(得分:0)

是您的ProgressBar设置为可取消的错误。

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

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