将缩略图加载到位图数组中 - 最佳实践

时间:2014-04-16 15:41:04

标签: android image bitmap

作为Android的完全新手和(不可否认)并不是最强大的程序员 - 我想要求将缩略图加载到位图数组中,然后将其加载到自定义适配器中。

缩略图非常小(大约5KB)。

我将缩略图添加到Async任务中的Bitmap数组中。我正在使用虚拟图像的drawables。所以我用虚拟图像加载整个列表(我稍后加载实际图像)。

如果用户浏览包含200多张图片的文件夹,我很担心。我可能会出现内存不足错误。我想要一种方法来防止这种情况,可能只加载可见显示中需要的东西,并在需要时加载更多?

我已经阅读了很多关于回收Bitmaps的其他问题和建议,但我仍然不确定从哪里开始。

   @Override
    protected Boolean doInBackground(DbxFileSystem... params) {
        //Opens thumbnails for each image contained in the  folder
        try {
        DbxFileSystem fileSystem = params[0];

        Bitmap image=null;

        int loopCount=0; //I use this to identify where in the adapter the real image should go
        for (DbxFileInfo fileInfo: fileSystem.listFolder(currentPath)) {

            try{

                if(!fileInfo.isFolder)
                {
                    image = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
                    pix.add(image);
                    paths.add(fileInfo.path);
                    loopCount++;

                }
                else
                {
                    //must be a folder if it has no thumb, so add folder icon
                    image = BitmapFactory.decodeResource(getResources(), R.drawable.dbfolder);
                    pix.add(image);
                    paths.add(fileInfo.path);
                    loopCount++;

                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            System.gc();

        }

    }
    catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        loadingDialog.dismiss();
    }
    return true;
}

以下是自定义适配器中的getView:

public View getView(final int position, View arg1, ViewGroup arg2) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);


    View v = arg1;
    ViewHolder holder;

    if (arg1 == null) {
        LayoutInflater vi = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.list_row, null);

        holder = new ViewHolder();
        holder.title = (TextView) v.findViewById(R.id.filename);
         holder.iconImage = (ImageView) v.findViewById(R.id.list_image);
        holder.checkbox = (CheckBox)v.findViewById(R.id.checkBox1);

        v.setTag(holder);
    } else {
        holder = (ViewHolder) v.getTag();
    }

        holder.title.setText(folderName.get(position).toString());


    holder.iconImage.setImageBitmap(images.get(position));

1 个答案:

答案 0 :(得分:0)

首先需要知道的是,在使用适配器时,只有在屏幕上显示视图时才会创建视图。这意味着您不需要,也不能解码所有位图。

最佳做法是在创建关联视图时解码AsyncTask中的每个位图。位图将在doInBackground方法中解码,并设置为ImageView方法中的onPostExecute(因为它在UI thread上执行)。

然后,您可能还希望使用RAM或磁盘缓存来更有效地重新加载先前解码的位图。

请查看http://developer.android.com/training/displaying-bitmaps/index.html,了解有关如何有效显示位图的更多信息。