您的位置:首页 > 移动开发 > Android开发

怎样获取android手机联系人并按字母展示(三)

2015-02-17 16:08 495 查看
假设获取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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: