Comment arrêter ( tuer ) AsyncTask dans android
Salut, je suis nouveau sur android:
Je suis affichant l'image miniature dans GridView. Pour une meilleure performance, je suis charger de manière asynchrone.
Mon AsyncTask est que:
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
private int data = 0;
private String image_path;
public BitmapWorkerTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
@Override
protected Bitmap doInBackground(Integer... params) {
data = params[0];
Bitmap picture = BitmapFactory.decodeFile(image_path);
int width = picture.getWidth();
int height = picture.getHeight();
float aspectRatio = (float) width / (float) height;
int newWidth = 98;
int newHeight = (int) (98 / aspectRatio);
return picture = Bitmap.createScaledBitmap(picture, newWidth,
newHeight, true);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
public void onDismiss(DialogInterface dialog) {
this.cancel(true);
}
}
et de l'Appel de la forme:
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ListRowHolder listRowHolder;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.ll_sponsor_list_item,
parent, false);
listRowHolder = new ListRowHolder();
listRowHolder.imgSponsor = (ImageView) convertView
.findViewById(R.id.imggrid_item_image);
convertView.setTag(listRowHolder);
} else {
listRowHolder = (ListRowHolder) convertView.getTag();
}
try {
BitmapWorkerTask task = new BitmapWorkerTask(
listRowHolder.imgSponsor);
task.image_path = ImageName.get(position);
task.execute(1);
} catch (Exception e) {
Toast.makeText(ctx, e + "", Toast.LENGTH_SHORT).show();
}
return convertView;
}
Le problème ici est que les tâches sont en cours d'exécution en arrière-plan, même lorsque j'ai cliqué sur le bouton de retour.
Vous pouvez essayer de
cancel(true)
ne fonctionne pas toujours. Aussi, si vous appelez cela, être prêt à saisir l'interruption des exceptions dans doInBackground
.
OriginalL'auteur Uttam Kadam | 2013-01-11
Vous devez vous connecter pour publier un commentaire.
Utilisation
annuler()
pour arrêter unAsyncTask
:La la documentation de AsyncTask apporte quelques détails supplémentaires dans le 'Annulation d'une tâche" de la section:
OriginalL'auteur Veger
Tout d'abord, vous avez besoin de garder des références à tous les asynctask vous exécutez. Lorsque l'activité s'arrête, vous devez parcourir les références à l'asynctask et les annuler avec annuler(). Vous devez également appeler get() sur chacun des asynctasks. Cela permettra de s'assurer que le thread d'INTERFACE utilisateur attend jusqu'à ce que l'asynctask est fini avant les activités de l'évolution.
Utiliser annuler(true) si vous souhaitez que l'asynctask du fil d'interruption ou de l'utilisation de l'annuler(le faux), et à des points dans votre doInBackground() la méthode que vous devriez vérifier isCancelled() et retour.
Pour plus de sécurité, vous devez être très prudent avec asynctasks. Découvrez cet article sur la manipulation sécuritaire.
OriginalL'auteur Samuel
Faire quelque chose comme ceci
Lorsque vous appuyez de nouveau sur l'Activité, mettre l'asynctask l'annulation d'un mode, de sorte qu'il va arrêter l'exécution de choses.
Vérifier pour l'annulation de la méthode à chaque pas que vous faites dans votre asynctask, pour l'arrêter sur la ligne suivante
Si vous utilisez votre propre, vous aurez plus de contrôle, comme son méthode CANCEL sur le Thread, il s'arrête, mais la meilleure façon de terminer ce thread est de vérifier pour votre annulé sur la critique des parties de l'algorithme
C'est ce qui est mis en œuvre dans asynctask pour vous. Vous appelez cancel(faux) si vous souhaitez garder le contrôle sur l'annulation, puis dans votre algorithme que vous venez de vérifier isCancelled(). C'est exactement ce que vous avez mis en place.
OriginalL'auteur noni