android получает детали контактов, такие как номер и миниатюра
Я использую этот код, который может получить номер контакта и миниатюру контакта, но это не подходит и занимает много времени для загрузки и подготовки контактов .
Пожалуйста, помогите мне улучшить производительность этого кода:
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;
Обновление 4/4/2015
- это медленно, потому что у него есть получение всего столбца от поставщика контактов , в этой таблице есть +20 столбцов, которые занимают много времени .
3 ответов:
Как насчет использования AsyncTaskLoader,
Напишите этот код, когда вы хотите получить список контактов
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) { } }И
public class InitializeApplicationsTask extends AsyncTaskLoader<Void> { @Override protected void onStartLoading() { forceLoad(); } @Override public Void loadInBackground() { // Query the contacts here and return null return null; } }
Это медленно, потому что вы получаете все столбцы от поставщика контактов, поэтому используйте проекцию, чтобы получить только те столбцы, которые требуются. как
String[] projection = {
ContactsContract.Contacts.DISPLAY_NAME // this is just example, add fields that required } ;Не могли бы вы сказать мне, какова цель второго запроса ? потому что вот мой результат получения контакта
И мой метод получения всех контактов -
@SuppressLint("InlinedApi") public void readContacts() { long l1 = System.currentTimeMillis(); Log.d("DEBUG", "starting readContacts() time " + l1); ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (cur.getCount() > 0) { while (cur.moveToNext()) { Contact_pojo cp = new Contact_pojo(); String Contact_Id = cur.getString(cur .getColumnIndex(ContactsContract.Contacts._ID)); String Contact_Name = cur .getString(cur .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); String photothumb = ""; try { photothumb = cur .getString(cur .getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI)); if (photothumb != null && !photothumb.toString().equalsIgnoreCase("")) { cp.setImageUri(photothumb); } } catch (Exception e) { e.printStackTrace(); } cp.setId(Contact_Id); cp.setName(Contact_Name); Cursor phones = cr.query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + " = " + Contact_Id, null, null); while (phones.moveToNext()) { String number = phones.getString(phones .getColumnIndex(Phone.NUMBER)); int type = phones.getInt(phones.getColumnIndex(Phone.TYPE)); Log.d("DEBUG", "number " + number + " type " + type); cp.setNumber(number); } phones.close(); contactList.add(cp); } } long l2 = System.currentTimeMillis(); Log.d("DEBUG", "Finished readContacts() time " + l2); Log.d("DEBUG","Total contact loaded "+contactList.size()+" within "+ (l2 - l1) + "ms"); }
Не используйте двойной запрос, это занимает слишком много времени, если устройство имеет много контактов, и он не работает в некоторых устройствах также...
Вы также можете получить контакт с помощью одного запроса..
Используйте код ниже..
public void fetchContacts() { String[] projection = new String[] { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.CONTACT_ID}; String _ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID; String DISPLAY_NAME = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? Contacts.DISPLAY_NAME_PRIMARY : Contacts.DISPLAY_NAME; String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER; Cursor cursor = mActivity.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER + "=?", new String[] { "1" }, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); System.out.println("contact size.."+cursor.getCount()); if (cursor.getCount() > 0) { while (cursor.moveToNext()) { String contact_id = cursor.getString(cursor.getColumnIndex( _ID )); String name = cursor.getString(cursor.getColumnIndex( DISPLAY_NAME )); String phoneNumber = cursor.getString(cursor.getColumnIndex(NUMBER)); System.out.println(" name : "+name); System.out.println(" number : "+phoneNumber); } } }Проверьте ссылки ниже для получения контактной фотографии.

Comments