一、异步处理和添加监听器回调
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(); } }); |