如何獲取android手機聯絡人並按字母展示(三)
阿新 • • 發佈:2019-01-04
如果獲取contact的頭像資訊並展示:
如何根據photoId來獲取bitmap:
public static Bitmap getContactPhoto(Context context, long photoId, BitmapFactory.Options options) { if (photoId < 0) { return null; } Cursor cursor = null; try { cursor = context.getContentResolver().query( ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, photoId), new String[] { Photo.PHOTO }, null, null, null); if (cursor != null && cursor.moveToFirst() && !cursor.isNull(0)) { byte[] photoData = cursor.getBlob(0); if (options == null) { options = new BitmapFactory.Options(); } options.inTempStorage = new byte[16 * 1024]; options.inSampleSize = 2; return BitmapFactory.decodeByteArray(photoData, 0, photoData.length, options); } } catch (java.lang.Throwable error) { } finally { if (cursor != null) { cursor.close(); } } return null; }
在bindView中加入:
protected void setContactPhoto(Cursor cursor, final ImageView viewToUse, int column) { long photoId = 0; if (!cursor.isNull(column)) { photoId = cursor.getLong(column); } final int position = cursor.getPosition(); viewToUse.setTag(new PhotoInfo(position, photoId)); if (photoId == 0) { viewToUse.setImageResource(R.drawable.avatar); } else { Bitmap photo = null; SoftReference<Bitmap> ref = mBitmapCache.get(photoId); if (ref != null) { photo = ref.get(); if (photo == null) { mBitmapCache.remove(photoId); } } if (photo != null) { viewToUse.setImageBitmap(photo); } else { viewToUse.setImageResource(R.drawable.avatar); mItemsMissingImages.add(viewToUse); if (mScrollState != OnScrollListener.SCROLL_STATE_FLING) { sendFetchImageMessage(viewToUse); } } } }
獲取的頭像的方法:
private class ImageLoaderHandler extends Handler { @Override public void handleMessage(Message message) { if (isFinishing()) { return; } switch (message.what) { case FETCH_IMAGE_MSG: { final ImageView imageView = (ImageView) message.obj; if (imageView == null) { break; } final PhotoInfo info = (PhotoInfo) imageView.getTag(); if (info == null) { break; } final long photoId = info.photoId; if (photoId == 0) { break; } SoftReference<Bitmap> photoRef = mBitmapCache.get(photoId); if (photoRef == null) { break; } Bitmap photo = photoRef.get(); if (photo == null) { mBitmapCache.remove(photoId); break; } synchronized (imageView) { final PhotoInfo updatedInfo = (PhotoInfo) imageView .getTag(); long currentPhotoId = updatedInfo.photoId; if (currentPhotoId == photoId) { imageView.setImageBitmap(photo); mItemsMissingImages.remove(imageView); } else { } } break; } } } public void clearImageFecthing() { removeMessages(FETCH_IMAGE_MSG); } } private class ImageLoader implements Runnable { long mPhotoId; private ImageView mImageView; public ImageLoader(long photoId, ImageView imageView) { this.mPhotoId = photoId; this.mImageView = imageView; } public void run() { if (isFinishing()) { return; } if (Thread.interrupted()) { return; } if (mPhotoId < 0) { return; } Bitmap photo = ContactsUtils.getContactPhoto(getBaseContext(), mPhotoId, null); if (photo == null) { return; } mBitmapCache.put(mPhotoId, new SoftReference<Bitmap>(photo)); if (Thread.interrupted()) { return; } Message msg = new Message(); msg.what = FETCH_IMAGE_MSG; msg.obj = mImageView; mHandler.sendMessage(msg); } }
下載頭像可以起執行緒池:
private void processMissingImageItems(AbsListView view) {
for (ImageView iv : mItemsMissingImages) {
sendFetchImageMessage(iv);
}
}
protected void sendFetchImageMessage(ImageView view) {
final PhotoInfo info = (PhotoInfo) view.getTag();
if (info == null) {
return;
}
final long photoId = info.photoId;
if (photoId == 0) {
return;
}
mImageFetcher = new ImageLoader(photoId, view);
synchronized (ContactsList.this) {
if (sImageFetchThreadPool == null) {
sImageFetchThreadPool = Executors.newFixedThreadPool(3);
}
sImageFetchThreadPool.execute(mImageFetcher);
}
}
public void clearImageFetching() {
synchronized (ContactsList.this) {
if (sImageFetchThreadPool != null) {
sImageFetchThreadPool.shutdownNow();
sImageFetchThreadPool = null;
}
}
mHandler.clearImageFecthing();
}
我們可以對下載做優化,在列表靜止的時候才去下,這個我們讓adatper繼承OnScrollListener,這樣有兩個過載函式:
<span style="white-space:pre"> </span>@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (SCROLL_STATE_TOUCH_SCROLL == scrollState) {
View currentFocus = getCurrentFocus();
if (currentFocus != null) {
currentFocus.clearFocus();
}
}
mScrollState = scrollState;
if (scrollState == OnScrollListener.SCROLL_STATE_FLING) {
clearImageFetching();
} else {
processMissingImageItems(view);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
在activity銷燬的時候,我們得去釋放資源:
@Override
protected void onDestroy() {
super.onDestroy();
if (mQueryHandler != null) {
mQueryHandler.cancelOperation(QUERY_TOKEN);
mQueryHandler = null;
}
if (mAdapter != null && mAdapter.mItemsMissingImages != null) {
mAdapter.mItemsMissingImages.clear();
mAdapter.clearMessages();
}
// Workaround for Android Issue 8488
// http://code.google.com/p/android/issues/detail?id=8488
if (mAdapter != null && mAdapter.mBitmapCache != null) {
for (SoftReference<Bitmap> bitmap : mAdapter.mBitmapCache.values()) {
if (bitmap != null && bitmap.get() != null) {
bitmap.get().recycle();
bitmap = null;
}
}
mAdapter.mBitmapCache.clear();
}
}
程式碼:http://download.csdn.net/detail/baidu_nod/7774203