使用位图数组进行Lazyload

时间:2014-04-10 09:17:23

标签: android

所以我的应用程序列出了给定Dropbox文件夹中的所有文件和文件夹。它们使用适配器列在自定义ListView中。

目前我使用drawables作为图像和文件夹图标。我遍历Dropbox文件夹结构并将所需的drawable添加到Bitmap数组。这是在异步任务(doInBackground)中完成的。

然后我在PostExecute中调用适配器,如下所示:

adapter = new ImageAdapter(this, pix, paths);
 lstView.setAdapter(adapter);

然后在ListView中显示所有文件和图像(带有默认的可绘制图标)。

我想要做的下一步是从Dropbox开始加载缩略图。 因此,对于List中的每个图像,我想用从Dropbox中检索到的缩略图替换drawable。 同样,这应该在异步任务中完成,这样用户仍然可以滚动列表视图。

使用dropbox,您可以加载这样的缩略图:

if(fileInfo.thumbExists)
                        {
                           file = fileSystem.openThumbnail(fileInfo.path, ThumbSize.XS, ThumbFormat.PNG);

                            Bitmap image = BitmapFactory.decodeStream(file.getReadStream());
                            thumbs.add(image);
                            file.close();
                        }

在上面的代码中,thumbs是一个位图数组。

我打算使用Universal Image Loader或Picasso。但是你不能将Bitmap数组传递给其中任何一个。它必须是URL或URI。

我怎样才能做到这一点?我猜我需要另一个异步任务,但我不确定如何更新我的适配器。

注意事项:

  • 我不想等到之前下载所有缩略图 开始显示它们

  • 如果有很多缩略图,是否会考虑内存?

  • 你能只在Visibile部分显示thumnails吗? listview,并在滚动时开始加载更多?

请记住 - 我使用的是一系列位图,我没有任何网址。我是否最好将每个位图保存到SD卡,然后使用UIL或Picasso加载URI?但是你怎么知道哪些图像进入了ListView中的哪个位置?

所以我的代码中的步骤最好是:

- 在Listview中加载带有虚拟图像的文件和文件夹(已经这样做了!)

- 从decodeStream获取缩略图并加载到位图数组

- 将缩略图放入ListView中的正确位置

1 个答案:

答案 0 :(得分:0)

对于列表视图的每一行,运行单独的线程以下载并显示缩略图图像。 我想,您可以避免使用位图数组并直接将下载的图像提供给列表视图行。

I)修改适配器的getView()回调,如下所示:

ImageView thumbnail = Container.findViewById(R.id.thumbnail) loadImageInBackground(缩略图,URL).execute();

II)loadImageInBackground将是一个实现AsyncTask

的类

a)数据成员:ImageView缩略图,字符串URL

b)构造函数:使用传递的实例初始化这些数据成员。

c)onPostExecute:将虚拟图像设置为此处的缩略图,直到下载所需图像为止。您甚至可以在此处设置动画图像以使其更好。

d)doInBackground:

                mUrl = new URL(strUrl);
                HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();   
                conn.setDoInput(true);   
                conn.connect();     
                InputStream is = conn.getInputStream();
                bmImg = BitmapFactory.decodeStream(is); 
                is.close();

            }
            catch (IOException e)
            {       
                e.printStackTrace();  
            }

e)onPostExecute:将this.thumbnail与this.bmImg相关联。

这样,对于列表视图的每一行,将初始化loadImageInBackground类的对象,并从URL下载图像并将其设置为相应行的图像View容器。

图像将在下载后立即显示在缩略图上。没有阻止,我的意思是,即使正在下载图像,用户也可以与应用程序进行交互。 如果您已经实现了延迟加载方法,那么这种方法在任何情况下都不会导致任何outOfMemory异常。而且,只有在用户滚动时才会下载新图像。 Point II.c提供在缩略图上设置加载动画/图像,直到下载实际图像为止。