应用程序在尝试阅读联系人时被绞死

时间:2016-06-23 07:29:51

标签: java android android-contacts

我正在处理一个应用程序,它会读取手机通讯录并以列表的形式显示它们。我必须从列表中向选定的联系人发送消息。但问题是,如果移动设备有超过500个联系人,应用程序将被挂起。我无法解决问题所在..

我在互联网上找到了这个代码,并在我的应用中实现。将显示联系人但是花了这么多时间。这是我的代码

ContentResolver cr = getActivity().getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null,null,null);
if (cur.getCount() > 0) {
   while (cur.moveToNext()) {
      String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
      String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
      if (Integer.parseInt(cur.getString(cur.getColumnIndex(
         ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
         Cursor pCur = 
                cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                null, 
                ContactsContract.CommonDataKinds.Phone.CONTACT_ID +"=?", 
                new String[]{id}, null);
         while (pCur.moveToNext()) {
              int phoneType = pCur.getInt(pCur.getColumnIndex(
                  ContactsContract.CommonDataKinds.Phone.TYPE));
              String phoneNumber = pCur.getString(pCur.getColumnIndex(
                  ContactsContract.CommonDataKinds.Phone.NUMBER));
              switch (phoneType) {
                    case Phone.TYPE_MOBILE:
                        Log.e(name + "(mobile number)", phoneNumber);
                        break;
                    case Phone.TYPE_HOME:
                        Log.e(name + "(home number)", phoneNumber);
                        break;
                    case Phone.TYPE_WORK:
                        Log.e(name + "(work number)", phoneNumber);
                        break;
                    case Phone.TYPE_OTHER:
                        Log.e(name + "(other number)", phoneNumber);
                        break;                                  
                    default:
                        break;
              }
          } 
          pCur.close();
    }
} }

2 个答案:

答案 0 :(得分:1)

阅读联系人 -

private void fetchContacts() {
    Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
    while (phones.moveToNext()) {
        String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        if (name == null || name.equals(""))
            name = phoneNumber;
        if (Utils.notNull(phoneNumber)) {
            phoneNumber = Utils.checkAndWrapMobileNumber(getApplicationContext(), phoneNumber);
            allContacts.put(phoneNumber, name);
            contactList.add(phoneNumber);
        }
    }
    phones.close();
}

最好在AssyncTask中使用此代码,以便在后台线程中阅读。

希望它会对你有所帮助:)。

答案 1 :(得分:0)

这是因为UI线程中的繁重任务会阻塞UI,为此目的使用AyncTask