2012-10-09 4 views
2
package com.example.asynctask; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.ProgressBar; 

public class MainActivity extends Activity { 
    ProgressBar progressbar; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     progressbar = (ProgressBar) findViewById(R.id.progressBar); 
    } 

    class ProgressTask extends AsyncTask<Integer, Integer, Void> { 

     private boolean flag = true; 

     @Override 
     protected void onPreExecute() { 
      progressbar.setMax(100); 
     } 

     @Override 
     protected void onCancelled() { 
      //progressbar.setMax(0); 
      flag = false; 
      Log.v("onCancelled:flag", String.valueOf(flag)); 
     } 

     @Override 
     protected Void doInBackground(Integer... params) { 
      // TODO Auto-generated method stub 
      int start = params[0]; 
      for (int i = start; i <= 100; i=i+10) { 

       if (!flag) { 
        break; 
       } else { 
        publishProgress(i); 
        try { 
         Thread.sleep(3000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         Log.e("ThreadError", e.toString()); 
        } 
       } 
      } 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
      progressbar.setProgress(values[0]); 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      Log.v("Progress", "Finish"); 
     } 

    } 

    public void onClick(View v) { 
     ProgressTask task = new ProgressTask(); 

     switch (v.getId()) { 
     case R.id.start: 
      task.execute(10); 
      break; 

     case R.id.stop: 
      task.cancel(true); 
      break; 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 
} 

Voici une application AsyncTask symple qui commence à mettre à jour la barre de progression lorsque vous cliquez sur Démarrer. Mais quand vous frapperez stop, il ne s'arrêtera pas. La chose est lorsque vous appelez task.cancel (true), onCancelled() méthodes n'obtient invoquées et modifie la valeur du drapeau à faux mais dans onCancelled() valeur des restes de drapeau vrai. J'ai également essayé isCancelled() à la place du drapeau varaible sans succès. Pour un moment mon problème est similaire à Ollie C, mais aucune exception n'est levée dans mon cas.Tâche asynchrone ne s'arrête pas

+3

Dans cette ligne 'tâche ProgressTask = new ProgressTask();'. Votre 'tâche' est dans la portée de cette méthode. Vous devriez créer une instance de classe 'task'. – Wenhui

+0

@Wenhui Ça a marché ... Merci – nik

Répondre

0

Comme Wenhui a souligné dans le commentaire, je fait une erreur stupide dans laquelle je déclarais et tâche instancié dans onClick (Voir v).

Questions connexes