由于在我的listview中添加联系人图像,android listview性能缓慢
我在演示中列出了联系人Uri中的所有联系人,在添加联系人图像后,我创建了自定义列表视图。我的列表视图滚动非常慢,下面是我的代码由于在我的listview中添加联系人图像,android listview性能缓慢,android,listview,Android,Listview,我在演示中列出了联系人Uri中的所有联系人,在添加联系人图像后,我创建了自定义列表视图。我的列表视图滚动非常慢,下面是我的代码 public Bitmap getProfilepicture(Activity activity, String address) { Bitmap bitmap; Uri personUri = Uri .withAppendedPath(Phones.CONTENT_FILTE
public Bitmap getProfilepicture(Activity activity, String address)
{
Bitmap bitmap;
Uri personUri = Uri
.withAppendedPath(Phones.CONTENT_FILTER_URL, address);
Cursor phoneCursor = activity.getContentResolver().query(personUri,
PHONE_PROJECTION, null, null, null);
if (phoneCursor.moveToFirst()) {
int indexPersonId = phoneCursor.getColumnIndex(Phones.PERSON_ID);
long personId = phoneCursor.getLong(indexPersonId);
phoneCursor.close();
Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, personId);
bitmap = People.loadContactPhoto(activity, uri, R.drawable.icon,
null);
return bitmap;
}
return null;
}
在方法的帮助下,我获得了我在getView方法中使用的联系人照片。像
holder.imgViewLogo.setImageBitmap(getProfilepicture(activity,pos));
它工作正常,但listview性能较低
请帮助我提高listview的性能。我建议将图像加载移动到后台任务。 从另一个线程中,将所有图像加载到内存中(或者您可以根据可见内容仅对列表的一部分进行缓存),一旦图像就绪,更新UI。 功能行为将是,首先,一些图像不会立即显示,但性能会更好
看看缓存数据可能会提高性能?尝试将此添加到代码中:
private static HashMap<String address, Bitmap image> cache = new HashMap<String address, Bitmap image>();
public Bitmap getProfilepicture(Activity activity, String address) {
if (cache.containskey(address) return cache.get(address);
Bitmap bitmap;
.
.
.
bitmap = People.loadContactPhoto(activity, uri, R.drawable.icon,
null);
cache.put(address,bitmap);
return bitmap;
}
private static HashMap cache=new HashMap();
公共位图getProfilepicture(活动,字符串地址){
if(cache.containskey(地址)返回cache.get(地址);
位图;
.
.
.
位图=People.loadContactPhoto(活动、uri、R.drawable.icon、,
无效);
cache.put(地址、位图);
返回位图;
}
这至少可以防止每次调用getView()时创建位图
根据此特定类的生命周期,您可能会或可能不会使缓存处于静态状态和/或将其状态保存到文件以供以后加载。您需要异步加载图像 这里有一个讨论这个问题的帖子 并将源代码称为源链接 GitHub:
来源:hi,感谢您的响应。我尝试过这个,但在那个类中,我从internet下载图像。我的情况是从联系人uri获得的。无论您是从internet下载、从光盘加载还是其他任何内容,加载图像都需要i/O,您只需要避免持有UI线程(例如getView)当你收到联系人图片时。重复Lior Ohana的回答。回答中有答案的链接。@cjk:啊,现在我读对了你的评论。我在发布我的评论时没有注意到这一点。