如果任务不在视图中如何杀死asynctask?

时间:2012-03-27 05:34:51

标签: android listview android-asynctask

我正在我的app中的 listview 中显示图片。来自给定网址的图片正在通过 asynctask 进行。如果我正在滚动我的列表视图很快,然后我的应用程序崩溃,因为许多asynctask线程并行工作(每个图像调用asynctask)。所以我需要取消/杀死那些看不见的线程。这意味着只有2-3个asynctask线程可以并行运行(我的列表一次只能显示2-3个项目)。可以帮助我吗?

4 个答案:

答案 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++;
            }