zoukankan      html  css  js  c++  java
  • 怎样获取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

  • 相关阅读:
    Zabbix5 Frame 嵌套
    Zabbix5 对接 SAML 协议 SSO
    CentOS7 安装 Nexus
    CentOS7 安装 SonarQube
    GitLab 后台修改用户密码
    GitLab 查看版本号
    GitLab Admin Area 500 Error
    Linux 安装 PostgreSQL
    Liger ui grid 参数
    vue.js 是一个怪东西
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4295316.html
Copyright © 2011-2022 走看看