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

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

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();

}

});

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值