作为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));
答案 0 :(得分:0)
首先需要知道的是,在使用适配器时,只有在屏幕上显示视图时才会创建视图。这意味着您不需要,也不能解码所有位图。
最佳做法是在创建关联视图时解码AsyncTask
中的每个位图。位图将在doInBackground
方法中解码,并设置为ImageView
方法中的onPostExecute
(因为它在UI thread
上执行)。
然后,您可能还希望使用RAM或磁盘缓存来更有效地重新加载先前解码的位图。
请查看http://developer.android.com/training/displaying-bitmaps/index.html,了解有关如何有效显示位图的更多信息。