我在数据库中有一些图像,我想用GridView
显示它们。
这是我从数据库中获取Bitmaps
的函数
public Bitmap getBitmaps(String tableName, int id, int index) {
String selectQuery = "SELECT * FROM " + tableName + " WHERE "
+ BaseColumns._ID + " = " + id;
Cursor cursor = mDatabase.rawQuery(selectQuery, null);
cursor.moveToFirst();
byte[] byteArray = cursor.getBlob(index);
return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
}
这是我GridView
的适配器
public View getView(final int position, View convertView,
ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
//..
} else {
//..
}
new AsyncTask<ViewHolder, Void, Bitmap>() {
private ViewHolder v;
@Override
protected Bitmap doInBackground(ViewHolder... params) {
v = params[0];
return getBitmaps(tableName, id,index);
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
if (v.position == position) {
v.image.setImageBitmap(result);
}
}
}.execute(viewHolder);
return convertView;
}
现在我有一个问题:
例如,我的GridView
中有 20 多个项目。当我向下滚动到列表的末尾时,需要 1 或 2 秒(如果列表变大,则需要更多秒)来加载某个位置的图像。如果我滚动到列表顶部,会出现同样的问题。
现在如何优化我的代码以平滑快速地滚动?
您必须更改方法,例如创建一个 ImageLoader 类并将您的请求传递给它。 在图像加载器中创建一个内存缓存 LRUCache 然后,如果请求在缓存中,如果它不是从数据库加载的,只需返回它,然后将其设置为 viewholder
. 对于每个viewholder
设置一个等于其位置的标签,然后在加载它时检查标签 viewholder
并查看它是否等于您刚刚加载的图像位置,如果相等,则设置图像,否则表示视图持有人已被回收。将引用保留viewholder
weakreference
,并在图像准备就绪时检查支架以查看它是否为空。
还可以进一步优化,例如回收bitmap
,您可以阅读文档以了解它是如何实现的。
快乐编码:-)