通过HTTP加载图像列表项

时间:2011-03-10 01:38:13

标签: android

我需要加载图片以进入ListLayout的每一行。目前,我有ExecutorService基本上执行以下操作:

pubilc View getView(...) {
    ...
    this.executor.execute(new Runnable() {
        public void run() {
            // load image over HTTP
            image.post(new Runnable() {
                public void run() {
                    image.setImageBitmap(loadedBitmap);
                }
            });
        }
    });
}

不幸的是,这确实不能很好地工作,我的图像不断重新加载错误的值,并且我的应用程序在尝试滚动时崩溃。建议的方法是什么?


修改

我已经更新了我的代码以使用AsyncTask实现来加载图像(这样做更有意义,更不用说头疼),但是我应该如何在我的适配器中对我的任务进行排序?如果我需要一次只运行一个任务,那很好,但我基本上需要一个我可以添加的列表并随意无效。同样奇怪的是,当我第一次启动我的应用程序时,图像加载,但更多时候,它们最初加载到错误的位置,然后重新加载几次,直到一切看起来都没问题。奇怪的。是否有建议的方法这样做?

2 个答案:

答案 0 :(得分:1)

我认为这样做的方法是让一个类来维护要下载的图像URL队列和一个(可变)数量的AsyncTasks来为队列提供服务。

班级应该能够:

  • 向队列中添加新的URL,这些URL由AsyncTasks提供服务
  • 取消在ListView中滚出视图的网址的任务(您可以从convertView中的getView()参数中检测到此内容)
  • 通过回调通知您的ListView某个网址的图片已加载,允许其查找并使该视图无效(刷新)

答案 1 :(得分:0)

使用以下方法从互联网上加载图片。

资源资源;     public static Bitmap LoadImage(String URL,BitmapFactory.Options options)     {         Bitmap bitmap = null;

    InputStream in = null;
    try {
        in = OpenHttpConnection(URL);
        // options.inSampleSize = 8;
        if (in == null) {
            bitmap = BitmapFactory.decodeResource(TennisAppActivity.mContext.getResources(),
                    R.drawable.profileplaceholder);
            return bitmap;
        } else {
            options.inSampleSize = 5;
            bitmap = BitmapFactory.decodeStream(in, null, options);
        }
        in.close();
    } catch (IOException e1) {
    }
    return bitmap;
}

然后调用看起来舔这个

final BitmapFactory.Options bmOptions; bmOptions = new BitmapFactory.Options(); 的LoadImage(的ImageUrl,bmOptions);

我希望这是有帮助的。