Не удалось получить все контакты из-за слишком большой работы в главном потоке

Я пытаюсь сохранить все контакты в String массив, но он не получает все контакты из-за следующей ошибки:

Я / Хореограф: Пропущено 213 кадров! Приложение может выполнять слишком много работы в своем основном потоке.

Java-код

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

2 ответа

Вам нужно получить контакт в фоновом потоке.

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();
    }
 } 
}});
Другие вопросы по тегам