• 怎样获取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

  • 相关阅读:
    JavaScript引擎简单总结
    浏览器内核简单总结
    JavaScript学习总结(十七)——Javascript原型链的原理
    JavaScript学习总结(十六)——Javascript闭包(Closure)
    JavaScript学习总结(十四)——JavaScript编写类的扩展方法
    JavaScript学习总结(十三)——极简主义法编写JavaScript类
    HashMap源码解析 jdk1.8
    位运算 1 << 4
    JavaScript学习总结(十二)——JavaScript编写类
    JavaScript学习总结(十一)——Object类详解
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4295316.html
Copyright © 2020-2023  润新知