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

假设获取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

你可能感兴趣的:(android)