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

我做了一个应用程序,从我们的服务器下载video。 问题是:

当我取消下载我呼吁:

myAsyncTask.cancel(true) 

我注意到, myAsyncTask不会停止调用取消…我ProgressDialog仍然上升,从状态跳转到状态显示我每次取消并通过单击下载button重新启动一个AsyncTask一个新的AsyncTask启动每次我点击下载..然后取消,然后再单独下载一个AsyncTask启动。

为什么myAsynTask.cancle(true)不取消我的任务? 我不想在背景上。 我只是想完全closures它,如果我点击取消。

怎么做 ?

编辑:

感谢gtumca-MAC,其他帮助我的人做到了:

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

谢谢!!!

AsyncTask不会取消进程

 myAsynTask.cancel(true) 

为此,您必须手动停止它。

例如你正在下载video在doInBackground(..)在while / for循环。

 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; } 

在你的class级申报

 DownloadFileAsync downloadFile = new DownloadFileAsync(); 

然后在创build

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

在你的背景()

 if (isCancelled()) break; @Override protected void onCancelled(){ } 

你可以通过杀死你的AsyncTask

 downloadFile.cancel(true); 

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

任何时候都可以通过调用cancel(boolean)来取消任务。 调用此方法将导致对isCancelled()的后续调用返回true。 调用这个方法之后,onCancelled(Object),而不是onPostExecute(Object)将在doInBackground(Object [])返回后被调用。 为了确保尽快取消任务,应该总是从doInBackground(Object [])中定期检查isCancelled()的返回值,如果可能的话(例如在一个循环内部)。

在文档中详细了解: http : //developer.android.com/reference/android/os/AsyncTask.html

我一直在研究从最近2周,我不知道我们如何手动杀死asynchronous操作。 一些开发者使用BREAK; 同时检查循环。 但在我的情况下,我不使用后台线程内的循环。 但是我已经知道它是如何炒作它的一个愚蠢的逻辑,但完美的作品。

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

而不是在后台线程上取消和做这么多的工作,以编程方式closureswifi

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

你想在哪里杀死这个操作,并把它打开,你需要在哪里。

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

会发生什么情况是您的尝试块跳转到IOException,以杀死后台任务。

您最好使用具有许多优先权和取消后台任务function的vogella asyncTask库。 一个很好的教程或使用它在这里

你可以使用这个代码。 我正在下载一个OTA文件如下:

 static class FirmwareDownload extends AsyncTask<String, String, String> { public String TAG = "Super LOG"; public String file; int lenghtOfFile; long total; @Override protected String doInBackground(String... f_url) { try { int count; Utilies.getInternet(); URL url = new URL(f_url[0]); URLConnection connection = url.openConnection(); connection.connect(); lenghtOfFile = connection.getContentLength(); mProgressBar.setMax(lenghtOfFile); InputStream input = new BufferedInputStream(url.openStream(), 8192); String fileName = f_url[0].substring(f_url[0].lastIndexOf("/"), f_url[0].length()); File root = Environment.getExternalStorageDirectory(); File dir = new File(root.getAbsolutePath() + fileName); Log.d(TAG, "trying to download in : " + dir); dir.getAbsolutePath(); OutputStream output = new FileOutputStream(dir); byte data[] = new byte[1024]; while ((count = input.read(data)) != -1) { if (isCancelled()) break; total += count; mProgressBar.setProgress(Integer.parseInt("" + total)); Log.d("Downloading " + fileName + " : ", " " + (int) ((total * 100) / lenghtOfFile)); mPercentage.post(new Runnable() { @Override public void run() { mPercentage.setText(total / (1024 * 1024) + " Mb / " + lenghtOfFile / (1024 * 1024) + " Mb"); } }); output.write(data, 0, count); } output.flush(); output.close(); input.close(); //new InstallHelper().commandLine("mkdir data/data/ota"); File fDest = new File("/data/data/ota/" + fileName); copyFile(dir, fDest); FirmwareInstaller fw = new FirmwareInstaller(); fw.updateFirmware(); } catch (Exception a) { System.out.println("Error trying donwloading firmware " + a); new InstallHelper().commandLine("rm -r data/data/ota"); dialog.dismiss(); } return null; } } 

所以,如果你想取消,只需使用下面的代码:

  fDownload.cancel(true); 

我已经用在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"/>