如何在android中停止(杀死)异步任务
嗨,我是android新手: 我正在GridView中显示图像拇指。为了获得更好的性能,我正在异步加载它 我的任务如下:如何在android中停止(杀死)异步任务,android,gridview,asynchronous,Android,Gridview,Asynchronous,嗨,我是android新手: 我正在GridView中显示图像拇指。为了获得更好的性能,我正在异步加载它 我的任务如下: class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { private final WeakReference<ImageView> imageViewReference; private int data = 0; privat
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);
}
}
这里的问题是,即使我单击了“后退”按钮,任务仍在后台运行。这样做
private class myAsyncTask extends AsyncTask<Void, String, Void> {
private boolean isTaskCancelled = false;
public void cancelTask(){
isTaskCancelled = true;
}
private boolean isTaskCancelled(){
return isTaskCancelled;
}
protected Void doInBackground( Void... ignoredParams ) {
//Do some stuff
if (isTaskCancelled()){
return;
}
}
protected void onPostExecute( Void array )
{
//Do something
}
protected void onProgressUpdate(String... values)
{
//Do something
}
}
私有类myAsyncTask扩展了AsyncTask{
私有布尔值isTaskCancelled=false;
公共任务(){
isTaskCancelled=true;
}
私有布尔值已取消(){
退货取消;
}
受保护的Void doInBackground(Void…ignoredParams){
//做点什么
如果(isTaskCancelled()){
返回;
}
}
受保护的void onPostExecute(void数组)
{
//做点什么
}
受保护的void onProgressUpdate(字符串…值)
{
//做点什么
}
}
当您按下“活动”上的后退键时,将asynctask置于取消模式,这样它将停止执行操作
在asynctask中执行的每个步骤中检查已取消的方法,以便在下一行停止它用于停止asynctask
:
task.cancel(true);
在“取消任务”部分中提供了一些其他详细信息:
可以随时通过调用来取消任务。援引
此方法将导致后续调用返回true。
调用此方法后,而不是
将在返回后调用。为了确保尽快取消任务,您应该始终定期检查的返回值,如果可能的话(例如在循环内)
首先,您需要保留对所执行的每个异步任务的引用。当活动暂停时,您应该遍历对asynctask的引用,并使用取消它们。您还应该调用每个异步任务。这将确保UI线程在更改活动之前等待asynctask完成 如果希望异步任务的线程被中断,请使用cancel(true),或者使用cancel(false),在doInBackground()方法中的某些点上,您应该检查并返回
为了安全起见,你必须非常小心地执行任务。查看如何安全处理它们。asynctask中已经有isCancelled()方法和cancel()方法。没有理由实现你自己的如果你使用你自己的,你会有更多的控制权,就像线程上的CANCEL方法一样,它会停止,但是完成该线程的更好方法是在算法的关键部分检查你的CANCEL,这是在asynctask中为你实现的。如果希望控制取消,则调用cancel(false),然后在算法中只需选中isCancelled()。这正是您所实现的。您可以尝试
cancel(true)
但不能保证始终工作。另外,如果调用此函数,请准备在doInBackground
中捕获中断异常。
task.cancel(true);