Search code examples
androidperformancethumbnailsandroid-contentproviderandroid-contacts

android get contacts detail such as number and thumbnail


i use of this code that can get contact's number and contact's thumbnail , but this is not suitable and take to long to load and prepare contacts .

please help me to improve performance of this code :

List<Contact_Pojo> list = new ArrayList<Contact_Pojo>();
ContentResolver cr = getActivity().getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
        null, null, Phone.DISPLAY_NAME + " ASC");

int i = 0;
if (cur.moveToFirst()) {
    while (cur.moveToNext()) {

        Cursor phoneCursor = getActivity()
                .getContentResolver()
                .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER, },
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = ?",
                        new String[] { cur.getString(cur
                                .getColumnIndex(ContactsContract.Contacts._ID)) },
                        null);

        if (phoneCursor.moveToFirst()) {
            Contact_Pojo personContact = new Contact_Pojo();
            /*
             * Id
             */
            personContact.setId(cur.getString(1));
            /*
             * Name
             */
            personContact
                    .setName(cur.getString(cur
                            .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
            /*
             * Photo ID
             */
            personContact
                    .setImageUrl(cur.getString(cur
                            .getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI)));
            /*
             * Number
             */
            personContact.setNumber(phoneCursor.getString(0));
            //
            list.add(personContact);
        }

        phoneCursor.close();

    }
}

cur.close();
return list;

Update 4/4/2015

  • it is slow because it has getting all column from contact provider , in this table has +20 column that take many time .

Solution

  • How about using AsyncTaskLoader,

    write this code when you want to get contacts list

    getLoaderManager() or getSupportLoaderManager().initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks<D> loadingCallback)

    public class LoadingCallback implements LoaderManager.LoaderCallbacks<Void> {
      @Override
      public Loader<Void> onCreateLoader(int i, Bundle bundle) {
        // Show your dialog;
        return new InitializeContactsTask(context, (ArrayList) contactList, mAdapter);
      }
    
      @Override
      public void onLoadFinished(Loader<Void> voidLoader, Void aVoid) {
        // UI Work here after background task and hide dialog.
      }
    
      @Override
      public void onLoaderReset(Loader<Void> voidLoader) {
      }
    }
    

    and

    public class InitializeApplicationsTask extends AsyncTaskLoader<Void> {
      @Override
      protected void onStartLoading() {
          forceLoad();
      }
    
      @Override
      public Void loadInBackground() {
          // Query the contacts here and return null
    
          return null;
      }
    }