我正在尝试使用来自网络的图像填充GridView,我称之为web服务(我没有图像的直接URL)。
为此,我正在使用Volley imageRequest。
一切都很好,除了需要一些时间来填充,当我在相同的片段或活动时,这是可以的。
但是当我点击每个单元格时,它应该在另一个Activity中打开,当GridView仍在填充时,需要很长时间才能打开另一个Activity。
当我想发布另一个Activity时,有人可以建议我如何停止所有异步数据库调用吗?
我尝试在ifCancelled()
和doInBackground()
内使用postExecute()
我尝试取消onPause()
,onStop()
,onDestroy()
,onDetach()
内的任务。
似乎没有任何效果 我也尝试过使用Picasso和Glide,但他们需要一个直接的URL。
我的异步任务:
private class GridImageTask extends AsyncTask<DevicePhoto, Void, Bitmap> {
private int mPosition;
private ViewHolder mHolder;
private volatile boolean running = true;
private final WeakReference<ImageView> imageViewReference;
public GridImageTask(int position, ViewHolder holder) {
mPosition = position;
mHolder = holder;
imageViewReference = new WeakReference<ImageView>(mHolder.imageview);
}
@Override
protected Bitmap doInBackground(DevicePhoto... arg0) {
Bitmap retBitmap = null;
// if(mTask.isCancelled()){
// retBitmap = null;
// }else if(mTask.getStatus() != Status.PENDING || mTask.getStatus() != Status.FINISHED) {
Log.i(TAG, "mTask.isCancelled()==="+mTask.isCancelled());
Log.i(TAG, "mTask.running()==="+mTask.running);
Log.i(TAG, "mTask.position()==="+mTask.mPosition);
if(!isCancelled()){
DevicePhoto photo = arg0[0];
requestPicture(mPosition, photo);
retBitmap = images.get(mPosition).thumbnail;
//notifyDataSetChanged();
}
return retBitmap;
}
@Override
protected void onPreExecute() {
running = true;
//super.onCancelled();
}
@Override
protected void onCancelled() {
mTask.cancel(true);
running = false;
//super.onCancelled();
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (isCancelled()) {
bitmap = null;
}
// bitmap = images.get(mPosition).thumbnail;
if (mHolder.id == mPosition && bitmap != null) {
if (imageViewReference != null) {
bitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, false);
ImageView imageview = (SnapCheckableImageView) imageViewReference.get();
if (imageview != null) {
imageview.setImageBitmap(bitmap);
//notifyDataSetChanged();
}
}
}
}
我在onStop()中的fragment中使用我的适配器类调用以下方法。
gridFragment类的onStop()我调用以下方法:
public void cancelAsynTaskOnStop(){
// Log.i(TAG, "cancelAsynTaskOnStop mTask.running >>>> "+mTask.running+ "mPosition == "+mTask.mPosition+" hmTaskMap.size() == "+hmTaskMap.size()+" task.getStatus() >> "+mTask.getStatus());
if(mTask != null){
mTask.cancel(true);
mTask.running = false;
}
if(hmTaskMap.size() > 0){
Iterator itr = hmTaskMap.keySet().iterator();
while(itr.hasNext()){
GridImageTask task = (GridImageTask)hmTaskMap.get(itr.next());
Log.i(TAG, "task.running === "+task.running+" task.mposition === "+task.mPosition+" status == "+task.getStatus());
if(task != null){
task.cancel(true);
task.running = false;
Log.i(TAG, "inside task.running === "+task.running+" task.mposition === "+task.mPosition+" status == "+task.getStatus());
}
答案 0 :(得分:0)
AsyncTask.cancel()不会在不考虑后果的情况下终止线程。它只是将AsyncTask设置为“已取消”状态。由AsyncTask的开发人员来决定是否遵守取消状态。
AsyncTask不应该用于长时间操作,因为它可以block other worker tasks。