Comment tuer / supprimer / supprimer / arrêter complètement un AsyncTask dans Android

J'ai créé une application qui télécharge des vidéos depuis notre serveur. Le problème est:

Quand j'annule le téléchargement, j'appelle:

  • Gestionnaire d'exception global non chargé -> courrier électronique pour moi?
  • Création de la disposition personnalisée du clavier Android
  • L'application s'écrase après la capture d'une image en utilisant des intentions
  • Android MediaRecorder et setOutputFile
  • Comment puis-je utiliser l'API Android Geofencing?
  • Superposition d'Android à l'extérieur / entre les limites de mise en page
  • myAsyncTask.cancel(true) 

    J'ai remarqué que myAsyncTask ne s'arrête pas lors de l'annulation d'appel … mon ProgressDialog augmente toujours et c'est comme passer du statut au statut, ce qui me montre que chaque fois que j'annule et recommence un AsyncTask en cliquant sur le bouton de téléchargement, une nouvelle AsyncTask démarre … Chaque fois que je clique sur le téléchargement … puis annule, puis un autre téléchargement d' AsyncTask distinct commence.

    Pourquoi myAsynTask.cancle(true) pas ma tâche? Je ne le veux plus sur le fond. Je veux simplement l'arrêter complètement si je clique sur Annuler.

    Comment faire ?

    MODIFIER:

    Merci à gtumca-MAC, et les autres qui m'ont aidé ont:

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

    Merci!!!

  • Android - Fuite de mémoire lors de la génération dynamique d'UI avec arrière-plan de ressource d'image
  • Comment obtenir la valeur d'un élément Listview qui est cliqué sur Android?
  • Créez un travail sur Android avec ConnectInstrumentTest ne fonctionne pas sur Jenkins
  • Utilisation de Guice pour injecter des dépendances dans le constructeur d'une activité Android
  • Inverser l'animation morphing de la flèche à la case à cocher
  • Comment spécifier le répertoire pour NDK_MODULE_PATH
  • 7 Solutions collect form web for “Comment tuer / supprimer / supprimer / arrêter complètement un AsyncTask dans Android”

    AsyncTask n'annule pas le processus sur

     myAsynTask.cancel(true) 

    Pour cela, vous devez l'arrêter manuellement.

    Par exemple, vous téléchargez la vidéo dans doInBackground(..) dans while / for loop.

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

    Déclarez dans votre classe

     DownloadFileAsync downloadFile = new DownloadFileAsync(); 

    Puis sur Créer

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

    Dans votre contexte ()

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

    Et vous pouvez tuer votre AsyncTask par

     downloadFile.cancel(true); 

    Lorsque vous démarrez un thread distinct (AyncTask), il doit terminer. Vous devez ajouter manuellement une instruction d'annulation à votre code dans AsyncTask.

    Une tâche peut être annulée à tout moment en invoquant cancel (boolean). L'appel de cette méthode entraînera des appels ultérieurs à isCancelled () pour renvoyer true. Après avoir invoqué cette méthode, onCancelled (Object), au lieu de onPostExecute (Object) sera invoqué après que doInBackground (Object []) retourne. Pour vous assurer qu'une tâche est annulée aussi rapidement que possible, vous devez toujours vérifier la valeur de retour de isCancelled () périodiquement de doInBackground (Object []), si possible (dans une boucle, par exemple).

    Cochez plus dans la documentation: http://developer.android.com/reference/android/os/AsyncTask.html

    Je fais des recherches depuis les 2 dernières semaines et je ne sais pas comment nous tuer manuellement l'opération Async. Certains développeurs utilisent BREAK; Tout en vérifiant la boucle. Mais sur mon scénario, je n'utilise pas la boucle dans le fil d'arrière-plan. Mais je dois savoir comment c'est une logique stupide mais fonctionne parfaitement bien.

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

    Au lieu d'annuler et de faire tellement de travail sur le fil d'arrière-plan, éteignez le wifi par programme

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

    Où voulez-vous tuer l'opération et l'activer où avez-vous besoin de cela.

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

    Ce qui se passe, c'est que votre tentative de blocage saute dans l'exception IOException qui tue les tâches en arrière-plan.

    Vous utilisez mieux vogella asyncTask library qui a beaucoup de fonctionnalités comme la priorité et l'annulation de la tâche d'arrière-plan. Et un excellent tutoriel ou l'utilisation est ici

    Vous pouvez utiliser ce code. Je télécharge un fichier OTA comme suit:

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

    Donc, si vous souhaitez annuler, utilisez ce code:

      fDownload.cancel(true); 

    J'ai utilisé avec succès dans une activité avec 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) { } 

    Et dans mon 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(); } }); 

    Et mon élément TextView xml …

      <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"/> 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.