由于主线程上的工作太多,无法获得所有联系人



我正在尝试将所有联系人存储在String数组中,但由于以下错误,它无法获取所有联系人:

I/编舞:跳过了213帧! 应用程序可能在其主线程上做了太多工作。

爪哇代码

    private void getContactList() {
    ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
            null, null, null, null);
    if ((cur != null ? cur.getCount() : 0) > 0) {
        progressDialog.show();
        while (cur != null && cur.moveToNext()) {
            String id = cur.getString(
                    cur.getColumnIndex(ContactsContract.Contacts._ID));
            String name = cur.getString(cur.getColumnIndex(
                    ContactsContract.Contacts.DISPLAY_NAME));
            if (cur.getInt(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()) {
                    String phoneNo = pCur.getString(pCur.getColumnIndex(
                            ContactsContract.CommonDataKinds.Phone.NUMBER));
                    // Log.i("tag", "Name: " + name);
                    // Log.i("tag", "Phone Number: " + phoneNo);

                    myname += name + ",";
                    mynumber += phoneNo + ",";
                }
                pCur.close();
                if (progressDialog.isShowing())
                    progressDialog.dismiss();
            }
        }
        Log.i("tag", "Name: " + myname + mynumber);
    }
    if (cur != null) {
        cur.close();
    }
}
您需要

在后台线程中获取联系人。

private class FetchContacts extends AsyncTask<Void, Void, 
  ArrayList<Contact>> {
  private final String DISPLAY_NAME = Build.VERSION.SDK_INT >= 
       Build.VERSION_CODES.HONEYCOMB ?
       ContactsContract.Contacts.DISPLAY_NAME_PRIMARY : 
  ContactsContract.Contacts.DISPLAY_NAME;
  private final String FILTER = DISPLAY_NAME + " NOT LIKE '%@%'";
  private final String ORDER = String.format("%1$s COLLATE NOCASE", 
  DISPLAY_NAME);
  @SuppressLint("InlinedApi")
  private final String[] PROJECTION = {
      ContactsContract.Contacts._ID,
      DISPLAY_NAME,
      ContactsContract.Contacts.HAS_PHONE_NUMBER
  };
 @Override
 protected ArrayList<LearnSaveContact> doInBackground(Void... params) {
  try {
      ArrayList<Contact> contacts = new ArrayList<>();
      ContentResolver cr = getContentResolver();
      Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI,  
      PROJECTION, FILTER, null, ORDER);
      if (cursor != null && cursor.moveToFirst()) {
          do {
              // get the contact's information
              String id = 
      cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
              String name = cursor.getString(cursor.getColumnIndex(DISPLAY_NAME));
              Integer hasPhone = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
              // get the user's email address
              String email = null;
              Cursor ce = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                      ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null);
              if (ce != null && ce.moveToFirst()) {
                  email = ce.getString(ce.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                  ce.close();
              }
              // get the user's phone number
              String phone = null;
              if (hasPhone > 0) {
                  Cursor cp = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                          ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null);
                  if (cp != null && cp.moveToFirst()) {
                      phone = cp.getString(cp.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                      cp.close();
                  }
              }
              // if the user user has an email or phone then add it to contacts
              if ((!TextUtils.isEmpty(email) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()
                      && !email.equalsIgnoreCase(name)) || (!TextUtils.isEmpty(phone))) {
                  Contact contact = new Contact();
                  contact.name = name;
                  contact.email = email;
                  contact.phoneNumber = phone;
                  contacts.add(contact);
              }
          } while (cursor.moveToNext());
          // clean up cursor
          cursor.close();
      }
      return contacts;
  } catch (Exception ex) {
      return null;
  }
}
 @Override
 protected void onPostExecute(ArrayList<Contact> contacts) {
  if (contacts != null) {
    // success
      mContacts = contacts;
  } else {
     // show failure
     // syncFailed();
  }
 }
}

public class Contact{
    public String name;
    public String email;
    public String phoneNumber;
    public Contact() {}
 }

试试这个:

 this.runOnUiThread(new Runnable() {
            public void run() {
    private void getContactList() {
    ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
            null, null, null, null);
    if ((cur != null ? cur.getCount() : 0) > 0) {
        progressDialog.show();
        while (cur != null && cur.moveToNext()) {
            String id = cur.getString(
                    cur.getColumnIndex(ContactsContract.Contacts._ID));
            String name = cur.getString(cur.getColumnIndex(
                    ContactsContract.Contacts.DISPLAY_NAME));
            if (cur.getInt(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()) {
                    String phoneNo = pCur.getString(pCur.getColumnIndex(
                            ContactsContract.CommonDataKinds.Phone.NUMBER));
                    // Log.i("tag", "Name: " + name);
                    // Log.i("tag", "Phone Number: " + phoneNo);

                    myname += name + ",";
                    mynumber += phoneNo + ",";
                }
                pCur.close();
                if (progressDialog.isShowing())
                    progressDialog.dismiss();
            }
        }
        Log.i("tag", "Name: " + myname + mynumber);
    }
    if (cur != null) {
        cur.close();
    }
 } 
}});

相关内容

  • 没有找到相关文章

最新更新