由于在我的listview中添加联系人图像,android listview性能缓慢

由于在我的listview中添加联系人图像,android listview性能缓慢,android,listview,Android,Listview,我在演示中列出了联系人Uri中的所有联系人,在添加联系人图像后,我创建了自定义列表视图。我的列表视图滚动非常慢,下面是我的代码 public Bitmap getProfilepicture(Activity activity, String address) { Bitmap bitmap; Uri personUri = Uri .withAppendedPath(Phones.CONTENT_FILTE

我在演示中列出了联系人Uri中的所有联系人,在添加联系人图像后,我创建了自定义列表视图。我的列表视图滚动非常慢,下面是我的代码

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:啊,现在我读对了你的评论。我在发布我的评论时没有注意到这一点。