android的开发一般的图片处理都会有异步加载和本地缓存,图片的异步加载目的是减少ui线程的耗时操作;
1)在Android应用中UI线程5秒没响应的话就会抛出无响应异常,启动一个新的线程来获取资源,完成后通过Handler机制发送消息,并在UI线程中处理消息,从而达到在异步线程中获取图片,然后通过Handler Message来更新UI线程的过程。
2)使用android中提供的AsyncTask来完成。**
public static void asyncGetAvatar(final Context context,final int photoId,final OnLoadAvatarFinishListener listener){
new AsyncTask<Void,Void, Bitmap>() {
@Override
protected Bitmap doInBackground(Void... params) {
//优先从缓存中取photoId所对应的头像图片
Bitmap bitmap=cache.get(photoId);
if(bitmap==null){
if(photoId==0){
//没有头像则为联系人设置头像
//bitmap=BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher);
bitmap=getMyAvatar(context);
cache.put(photoId,bitmap);
}else{
//有头像在data数据表中的data15列
ContentResolver cr=context.getContentResolver();
Cursor cursor=cr.query(Data.CONTENT_URI,
new String[]{Data.DATA15},
Data._ID+"=?",
new String[]{String.valueOf(photoId)},
null);
cursor.moveToNext();//指向第一条数据
byte[] bytes=cursor.getBlob(0);
Bitmap avatar=BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
cursor.close();
bitmap = getCircleAvatar(context,avatar);
//把获得的头像放到缓存中存储起来
cache.put(photoId,bitmap);
}
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
listener.onLoadAvatarFinis(result);
}
}.execute();
}
版权声明:本文为kang995066277原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。