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

}

});

时间: 2024-08-29 10:29:30

day5.03总结_友录_优化(异步和缓存和回调)的相关文章

day4.29总结_友录_设置圆圈和显示联系人的详细信息

一.显示头像 ContactAdapter public View getView(int position, View convertView, ViewGroup parent) { ViewHolder vh; if(convertView==null){ convertView = inflater.inflate(R.layout.item_contact_layout, parent,false); vh = new ViewHolder(); vh.ivAvatar = (Imag

day4.28总结_友录_启动页面和联系人页面

一.启动页面 SplashActivity: public class SplashActivity extends Activity { RelativeLayout animaContainer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); initView

02组_现代软件工程_第03次作业——对于自身评价(原有水平以及长远目标分析总结)

02组_现代软件工程_第03次作业 --对于自身评价(原有水平以及长远目标分析总结) 李聿轩 ---------------------------------------------------------------------------- 一.原有水平 1.技术水平 ①Java基础开发 A.基本语法逻辑的代码完成 B.利用基本内容完成控件功能的设计以及实现 C.多线程的管理控制,队列,栈的使用相对较少 ②Android开发 A.会使用原生的控件显示,利用诸如Activity,Servic

Spring_MVC_教程_快速入门_深入分析

Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 作者:赵磊 博客:http://elf8848.iteye.com 目录 一.前言 二.spring mvc 核心类与接口 三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明

基本数据类型(字符串_数字_列表_元祖_字典_集合)

基本数据类型(字符串_数字_列表_元祖_字典_集合) 1.字符串 2.数字 除了布尔类型外,int.long.float和complex都可以使用的运算为:加.减.乘.除.整除.幂运算和取余 3.列表和元组 列表的内容可变,可以包含任意对象,使用中括号表示.元组的内容不可变,可以包含任意对象,使用圆括号表示.元组 1 l = [1, 2, 3, '4', '5'] # 列表 2 l = list((1, 2, 3, '4', '5')) 3 4 t = (1, 2, 3, '4', '5') #

机器学习_深度学习_入门经典(永久免费报名学习)

机器学习_深度学习_入门经典(博主永久免费教学视频系列) https://study.163.com/course/courseMain.htm?courseId=1006390023&share=2&shareId=400000000398149 作者座右铭---- 与其被人工智能代替,不如主动设计机器为我们服务. 长期以来机器学习很多教材描述晦涩难懂,大量专业术语和数学公式让学生望而止步.生活中机器学习就在我们身边,谷歌,百度,Facebook,今日头条都运用大量机器学习算法,实现智能

多线程_创建线程_继承Thread类

public class ThreadDemo {   public static void main(String[] args){         Demo d = new Demo();   d.start();      for(int i = 0;i < 100;i++){      System.out.println("MainThread" + i);   }   } } class Demo extends Thread {   public void run(

图形学_多边形扫描转换_边界标志算法

边界标志算法 1. 对多边形的每一条边进行扫描转换,即对多边形边界所经过的象素作一个边界标志. 2.填充 对每条与多边形相交的扫描线,按从左到右的顺序,逐个访问该扫描线上的象素. 取一个布尔变量inside来指示当前点的状态,若点在多边形内,则inside为真.若点在多边形外,则inside为假. Inside 的初始值为假,每当当前访问象素为被打上标志的点,就把inside取反.对未打标志的点,inside不变. 1 #include "easyx.h" 2 #include &qu

结对编程_附加题_博客2

1.界面模块,测试模块和核心模块的松耦合 2.改进程序 结对编程_附加题_博客2