两种方法读取联系人差别为什么这么大呢?

我用了测试两种方法读取手机中的联系人,一种用直接读取函数  readContacts();,一种用异步加hashmap函数 init();,可直接读取很快,异步的反而要好几十秒,感觉异步的应该很快啊,都是抄的别人的代码,这是为什么呢?
 

package com.rui.Kphone;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Fragment;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

//import android.widget.TextView;

public class ContactsFragment extends Fragment {

//private ListView personList;
private AsyncQueryHandler asyncQuery;
private List<ContactBean> contactList = new ArrayList<ContactBean>();
private Map<Integer, ContactBean> contactIdMap = null;
   
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
        View ContactsLayout = inflater.inflate(R.layout.contacts, container, false);
       init();
      // readContacts();
        ContactAdapter adapter = new ContactAdapter(this.getActivity(), R.layout.contact_list_item, contactList);
         ListView listView = (ListView) ContactsLayout.findViewById(R.id.ContactlistView);
        
         listView.setAdapter(adapter);
        
        
      
        return ContactsLayout;
     }

    private void readContacts() {
     Cursor cursor = null;
     try {
     // 查询联系人数据
     cursor = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
     while (cursor.moveToNext()) {
     // 获取联系人姓名
     String displayName = cursor.getString(cursor.getColumnIndex(
     ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
     // 获取联系人手机号
     String number = cursor.getString(cursor.getColumnIndex(
     ContactsContract.CommonDataKinds.Phone.NUMBER));
     ContactBean cb = new ContactBean();
cb.setDisplayName(displayName);
cb.setPhoneNum(number);
     contactList.add(cb);
     }
     } catch (Exception e) {
     e.printStackTrace();
          } finally {
     if (cursor != null) {
     cursor.close();
     }
     }
     }
    

private void init(){
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; // 联系人的Uri
String[] projection = { 
ContactsContract.CommonDataKinds.Phone._ID,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.DATA1,
"sort_key",
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.CommonDataKinds.Phone.PHOTO_ID,
ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY
}; // 查询的列
asyncQuery = new MyAsyncQueryHandler(getActivity().getContentResolver());
asyncQuery.startQuery(0, null, uri, projection, null, null,
"sort_key COLLATE LOCALIZED asc"); // 按照sort_key升序查询
}





/**
 * 数据库异步查询类AsyncQueryHandler
 * 
 * @author administrator
 * 
 */
private class MyAsyncQueryHandler extends AsyncQueryHandler {

public MyAsyncQueryHandler(ContentResolver cr) {
super(cr);
}

/**
 * 查询结束的回调函数
 */
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
if (cursor != null && cursor.getCount() > 0) {

contactIdMap = new HashMap<Integer, ContactBean>();

//list = new ArrayList<ContactBean>();
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToPosition(i);
String name = cursor.getString(1);
String number = cursor.getString(2);
String sortKey = cursor.getString(3);
int contactId = cursor.getInt(4);
Long photoId = cursor.getLong(5);
String lookUpKey = cursor.getString(6);

//if (contactIdMap.containsKey(contactId)) {

//}else{

ContactBean cb = new ContactBean();
cb.setDisplayName(name);
// if (number.startsWith("+86")) {// 去除多余的中国地区号码标志,对这个程序没有影响。
// cb.setPhoneNum(number.substring(3));
// } else {
cb.setPhoneNum(number);
// }
cb.setSortKey(sortKey);
cb.setContactId(contactId);
cb.setPhotoId(photoId);
cb.setLookUpKey(lookUpKey);
contactList.add(cb);

contactIdMap.put(contactId, cb);

//}
}

}

}
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值