
我正在使用游标获取联系人数据并尝试将其加载到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 – 联系人列表与联系人照片创建性能问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)