码迷,mamicode.com
首页 > 其他好文 > 详细

day5.03总结_友录_优化(异步和缓存和回调)

时间:2016-05-13 04:28:59      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

一、异步处理和添加监听器回调

YouluUtil

public static void asyncGetAllContact2(final Context context,final OnLoadContactsFinishListener listener){                                               传一个监听器

new AsyncTask<Void, Void, List<Contact>>() {

@Override

protected List<Contact> doInBackground(Void... params) {

return getAllContacts(context);加载时用异步

}

@Override

protected void onPostExecute(List<Contact> list) {处理结果

Collections.sort(list,new Comparator<Contact>() {

@Override

public int compare(Contact lhs, Contact rhs) {

return lhs.getName().toUpperCase().compareTo(rhs.getName().toUpperCase());

}

});

Contact contact = new Contact();

contact.setName("添加联系人");

list.add(0,contact);

//利用结果,刷新GridView界面

listener.onLoadFinish(list);            回调

}

}.execute();

}

ContactBiz

public void asyncGetAllContact2(OnLoadContactsFinishListener listener){

YouluUtil.asyncGetAllContact2(context, listener);

}

ContactFragment

private void refresh() {

biz.asyncGetAllContact2(new OnLoadContactsFinishListener() {

@Override

public void onLoadFinish(List<Contact> contacts) {

adapter.addAll(contacts, true);  更新页面

}

});

}

OnLoadContactsFinishListener  

public interface OnLoadContactsFinishListener {   新建一个借口

//当从数据库中加载联系人信息完毕后,会调用该方法

void onLoadFinish(List<Contact> contacts);

}

二、使用缓存机制

private static int maxSize =(int) (Runtime.getRuntime().maxMemory()/8);运行时的最大内存

//public static Map<Integer,Bitmap> cache = new HashMap<Integer, Bitmap>();

public static LruCache<Integer,Bitmap> cache = new LruCache<Integer,Bitmap>(maxSize){

protected int sizeOf(Integer key, Bitmap value) {

重写sizeOf方法   //图片行的字节数 * 图片的高

return value.getRowBytes()*value.getHeight();

}

};

public static Bitmap getAvatar(Context context, int photoId) {

//优先从缓存找photoid对应的图片

Bitmap bitmap = cache.get(photoId);

Log.i("tag",bitmap==null?"头像要从数据库取":"从缓存取" );

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;

}

需要注意的问题是:编辑更新头像时,由于是先从缓存中取,但缓存中的数据并没更新

处理的方法:在跳到更新页面之前,必须清除缓存中相对应的头像。

ivEdit.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

remaoveFromCache(contact.getPhoto_id());

//发送一个隐式intent,打开系统的联系人界面编辑contact的信息

Intent intent = new Intent(Intent.ACTION_EDIT);

Uri data = ContactsContract.Contacts.getLookupUri(contact.get_id(), contact.getLookupKey());

intent.setDataAndType(data , ContactsContract.Contacts.CONTENT_ITEM_TYPE);

intent.putExtra("finishActivityOnSaveCompleted", true);

context.startActivity(intent);

dialog.dismiss();

}

});

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

day5.03总结_友录_优化(异步和缓存和回调)

标签:

原文地址:http://blog.csdn.net/gsd1602_yingmu/article/details/51336199

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!