如何在Android中完全杀死/删除/删除/停止AsyncTask

时间:2012-06-04 13:54:59

标签: android android-asynctask

我制作了一个从我们的服务器上下载视频的应用。 问题是:

当我取消下载时,我打电话:

myAsyncTask.cancel(true)

我注意到,myAsyncTask在调用取消时没有停止...我的ProgressDialog仍然上升,就像从状态跳到状态一样,每次我取消并重新开始AsyncTask点击下载按钮,新AsyncTask开始... 每次我点击下载..然后取消,然后再次下载单独的AsyncTask开始。

为什么myAsynTask.cancle(true)没有取消我的任务?我不再想要它了。如果我点击取消,我只想完全关闭它。

怎么做?

E D I T:

感谢gtumca-MAC,以及其他帮助过我的人:

while (((count = input.read(data)) != -1) && (this.isCancelled()==false)) 
{
    total += count;
    publishProgress((int) (total * 100 / lenghtOfFile));
    output.write(data, 0, count);
}

感谢!!!

7 个答案:

答案 0 :(得分:53)

AsyncTask不会取消

上的进程
myAsynTask.cancel(true) 

为此你必须手动停止它。

例如,您正在{/ 1}}下载while / for循环中的视频。

doInBackground(..)

答案 1 :(得分:4)

在你的班级宣布

DownloadFileAsync downloadFile = new DownloadFileAsync();

然后在创建

DownloadFileAsync downloadFile = new DownloadFileAsync();
downloadFile.execute(url);

在你的背景中()

if (isCancelled())
    break;

@Override
protected void onCancelled(){

}

你可以通过

杀死你的AsyncTask
downloadFile.cancel(true);

答案 2 :(得分:1)

当你启动一个单独的线程(AyncTask)时,它必须完成。您必须手动将取消语句添加到AsyncTask内的代码中。

可以通过调用cancel(boolean)随时取消任务。调用此方法将导致后续调用isCancelled()返回true。调用此方法后,将在doInBackground(Object [])返回后调用onCancelled(Object)而不是onPostExecute(Object)。为确保尽快取消任务,应始终定期从doInBackground(Object [])检查isCancelled()的返回值(如果可能)(例如在循环内)。

在文档中查看更多内容:http://developer.android.com/reference/android/os/AsyncTask.html

答案 3 :(得分:0)

我一直在研究过去两周,我不知道我们如何手动杀死异步操作。一些开发人员使用BREAK;在检查循环时。但在我的场景中,我没有在后台线程中使用循环。 但我必须知道它是如何制作一个愚蠢的逻辑,但工作得非常好。

downloadFile.cancel(true);   //This code wont work in any case.

而不是取消并在后台线程上做这么多工作,而不是以编程方式关闭wifi

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(false);

你想在哪里杀死它并在你需要的地方打开它。

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(true);

您的try块会跳转到IOException,从而导致后台任务崩溃。

答案 4 :(得分:0)

您最好使用vogella asyncTask库,它具有许多功能,如优先级和取消后台任务。一个很好的教程或使用它是here

答案 5 :(得分:0)

您可以使用此代码。我正在下载OTA文件,如下所示:

 fDownload.cancel(true);

所以,如果你想取消,只需使用这段代码:

{{1}}

答案 6 :(得分:0)

我在使用TextView onclick ...

的活动中成功使用
        //inside the doInBackground() ...

        try {
        while (true) {
        System.out.println(new Date());

        //should be 1 * 1000 for second
        Thread.sleep(5 * 1000);
        if (isCancelled()) {
              return null;
        }
          }

        } catch (InterruptedException e) {

        }

和我的onCreate()......

     //set Activity
     final SplashActivity sPlashScreen = this;

     //init my Async Task
     final RetrieveFeedTask syncDo = new RetrieveFeedTask();
     syncDo.execute();

     //init skip link
     skip_text = (TextView) findViewById(R.id.skip_text);
     skip_text.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            //cancel Async
            syncDo.cancel(true);

            //goto/start another activity
            Intent intent = new Intent();
            intent.setClass(sPlashScreen, MainActivity.class);
            startActivity(intent);
            finish();

        }
    });

和我的xml TextView元素......

   <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/skip_text"
        android:layout_marginTop="20dp"
        android:text="SKIP"
        android:textColor="@color/colorAccent"/>