我正在我的app中的 listview 中显示图片。来自给定网址的图片正在通过 asynctask 进行。如果我正在滚动我的列表视图很快,然后我的应用程序崩溃,因为许多asynctask线程并行工作(每个图像调用asynctask)。所以我需要取消/杀死那些看不见的线程。这意味着只有2-3个asynctask线程可以并行运行(我的列表一次只能显示2-3个项目)。可以帮助我吗?
答案 0 :(得分:0)
一种方法是可以缓冲要在列表视图中显示的所有图像,然后显示。这将提高列表的性能,因为无论何时滚动列表,它都会从网络下载图像,这很麻烦。有了这个,您也不必为了查看视图外组件的异步任务而烦恼。
答案 1 :(得分:0)
你告诉你的情况应该在你的LazyLoading
上使用ListView
而我似乎OutOfMemory
错误,因为滚动太快导致解码位图太快,而实际垃圾收集器可能会带走你的垃圾Bitmap
答案 2 :(得分:0)
对我而言似乎不是AssynchTask问题,如果你使用Factory方法解码你的Bitmap,那么它主要是MemoryIssue
public Bitmap decode(String file, int quality) {
BitmapFactory.Options o2 = null;
try {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file, o);
final int REQUIRED_WIDTH = 240;
final int REQUIRED_HEIGHT = 280;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = quality;
scale = quality;
while (true) {
if (width_tmp / 2 < REQUIRED_WIDTH
|| height_tmp / 2 < REQUIRED_HEIGHT)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
} catch (Exception e) {
Log.i("Decodeing error2", "" + e.getMessage());
}
try {
return BitmapFactory.decodeFile(file, o2);
} catch (Exception e) {
Log.i("Decodeing error1", "" + e.getMessage());
return null;
}
在质量上给出4或5个文件,您可以用InputStream
替换它,并且您还必须更改一些代码以使其在您的程序中可用
答案 3 :(得分:0)
我找到了这个问题的解决方案。我正在将所有asynctask活动添加到arraylist。除了最后2-3个asynctasks我杀死了arraylist.code中的每个元素,如下所示。
if(count<maxConst){
task=new HandleOfferImage();
offerImageTask.add(task);
task.execute(obj);
count++;
}else{
for(int nCount=0;nCount<offerImageTask.size()-2;nCount++){
offerImageTask.get(nCount).cancel(true);
offerImageTask.remove(nCount);
}
task=new HandleOfferImage();
offerImageTask.add(task);
task.execute(obj);
count++;
}