android– 联系人列表与联系人照片创建性能问题

android– 联系人列表与联系人照片创建性能问题,第1张

概述我正在使用游标获取联系人数据并尝试将其加载到ListView中我根据QuickContactAPIDemos样本开发了我的代码(APILevel8)这是我的代码,我已经修改了一点,但我面临性能问题如果我删除了联系人照片代码,那么性能会很好,否则就像拖动列表一样慢适配器代码privateclassCont

我正在使用游标获取联系人数据并尝试将其加载到ListVIEw中

我根据QuickContact APIDemos样本开发了我的代码(API Level 8)

这是我的代码,我已经修改了一点,但我面临性能问题
如果我删除了联系人照片代码,那么性能会很好,否则就像拖动列表一样慢

适配器代码

    private class Contactlistadapter extends ResourceCursorAdapter{         Cursor cur;        public Contactlistadapter(Context context, int layout, Cursor c) {            super(context, layout, c);            cur = c;            // Todo auto-generated constructor stub        }        @OverrIDe        public voID bindVIEw(VIEw vIEw, Context arg1, Cursor arg2) {            // Todo auto-generated method stub            final ContactListItemCache cache = (ContactListItemCache) vIEw.getTag();            TextVIEw nameVIEw = cache.nameVIEw;            QuickContactBadge photoVIEw = cache.photoVIEw;                        cur.copyStringToBuffer(cur.getColumnIndexOrThrow(ContactsContract.Contacts.disPLAY_name), cache.nameBuffer);            int size = cache.nameBuffer.sizecopIEd;            cache.nameVIEw.setText(cache.nameBuffer.data, 0, size);                      long contactID = cur.getLong(cur.getColumnIndex(ContactsContract.Contacts._ID));            Uri contactUri = Uri.withAppendedpath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contactID));           inputStream input = ContactsContract.Contacts.openContactPhotoinputStream(getContentResolver(), contactUri);                        cache.photoVIEw.setimageBitmap(BitmapFactory.decodeStream(input));        }        @OverrIDe        public VIEw newVIEw(Context context, Cursor cursor, VIEwGroup parent) {            VIEw vIEw = super.newVIEw(context, cursor, parent);            ContactListItemCache cache = new ContactListItemCache();            cache.nameVIEw = (TextVIEw) vIEw.findVIEwByID(R.ID.name);            cache.photoVIEw = (QuickContactBadge) vIEw.findVIEwByID(R.ID.badge);            vIEw.setTag(cache);            return vIEw;        }       }       final static class ContactListItemCache {            public TextVIEw nameVIEw;            public QuickContactBadge photoVIEw;            public ChararrayBuffer nameBuffer = new ChararrayBuffer(128);        }}

获取联系人代码

private Cursor getContacts()   {        // Run query        Uri uri = ContactsContract.Contacts.CONTENT_URI;        String[] projection = new String[] {                ContactsContract.Contacts._ID,                ContactsContract.Contacts.disPLAY_name,                ContactsContract.Contacts.LOOKUP_KEY        };        String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" +                (mShowInvisible ? "0" : "1") + "'";        String[] selectionArgs = null;        String sortOrder = ContactsContract.Contacts.disPLAY_name + " ColLATE             LOCAliZED ASC";        return managedquery(uri, projection, selection, selectionArgs, sortOrder);}

注意:
我经历了这个线程,但我们都使用不同的方法
Load contact photo in a listview performance

编辑

我已按照代码写下来但是打电话

imageDownloader.download(contactUri, (ImageVIEw) cache.photoVIEw , getContentResolver(), contactID);

下载图像代码

Bitmap downloadBitmap(Uri url) {        final int IO_BUFFER_SIZE = 4 * 1024;        inputStream inputStream = null;        try {            inputStream = ContactsContract.Contacts.openContactPhotoinputStream(resolver, url);                        if(inputStream ==null){                return  BitmapFactory.decodeStream(inputStream);            }else            {                return  BitmapFactory.decodeStream(new FlushedinputStream(inputStream));            }            // return BitmapFactory.decodeStream(inputStream);            // BUG on slow connections, fixed in future release.        } finally {            if (inputStream != null) {                try {                    inputStream.close();                } catch (IOException e) {                    // Todo auto-generated catch block                    e.printstacktrace();                }            }        }    }

但是我使用这个代码的问题,我几秒后快速向下滚动
QuickBadgeContact小部件正在加载,之前没有任何内容出现在QuickBadgeContact的占位符中.

看到图像

有时图像出现很长时间后,请看这里

所以它不能正常工作联系ListVIEw在androID工作中,如果我们滚动得快得多,那么默认情况下,QuickBadgeContact将作为占位符,QuickBadgeContact中的图像稍后加载,但在我的代码中,整个徽章在几秒后出现

我只需要继续将图像加载到有照片的联系人,然后让其他人不动,因为这是加载黑色位图,其中没有为用户找到图像,但我不知道我该怎么做?

解决方法:

保持应用程序响应的简单规则是:不要在UI线程上执行I / O. bindVIEw()实现会破坏规则,因为它从数据库中读取位图.在慢速I / O *** 作完成时,主线程被阻塞.

您应该创建AsyncTasks来加载图像.最佳实践AFAIK是在您的应用程序中拥有一个完全可重用的ImageCache类…使用如下方法:

public static voID getimage(Uri imageUri, ImageVIEw imageVIEw);

即你给它一个URI和一个ImageVIEw引用,它将负责在后台线程上下载图像并在它准备好时更新ImageVIEw.

还有更多的东西……未完成的请求需要被取消,你应该在WeakReferences中保存ImageVIEws以避免泄漏它所属的Activity(有一个关于这个的AndroID Developer的博客文章).

总结

以上是内存溢出为你收集整理的android – 联系人列表与联系人照片创建性能问题全部内容,希望文章能够帮你解决android – 联系人列表与联系人照片创建性能问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1109749.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存