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
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
@Wenhui Ça a marché ... Merci – nik