Извлечение контактов в Android очень медленно

Я написал код, чтобы получить имя контакта, номер телефона и изображение из «Контакты» и отобразить его в списке в Android. Он работает нормально, но требует больше времени для загрузки. Я пытался использовать многопоточность в некоторых частях кода. Но время загрузки не уменьшается.

Вот метод onCreate() :

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lvDetail = (ListView) findViewById(R.id.listView1); fetchcontacts(); lvDetail.setAdapter(new MyBaseAdapter(context, myList)); } 

Вот код для извлечения контактов:

  private void fetchcontacts() { // TODO Auto-generated method stub Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC"); int count = cursor.getCount(); if (count > 0) { Toast.makeText(context, "count >0", Toast.LENGTH_SHORT).show(); while (cursor.moveToNext()) { String columnId = ContactsContract.Contacts._ID; int cursorIndex = cursor.getColumnIndex(columnId); String id = cursor.getString(cursorIndex); name = cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); Toast.makeText(context, "Toast 1", Toast.LENGTH_SHORT).show(); int numCount = Integer.parseInt(cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))); if (numCount > 0) { Toast.makeText(context, "Toast 2", Toast.LENGTH_SHORT).show(); Cursor phoneCursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, CommonDataKinds.Phone.CONTACT_ID+" = ?", new String[] { id }, ContactsContract.Contacts.DISPLAY_NAME + " ASC"); while (phoneCursor.moveToNext()) { Toast.makeText(context, "Toast 3", Toast.LENGTH_SHORT).show(); phoneNo = phoneCursor.getString(phoneCursor .getColumnIndex(ContactsContract.CommonDataKinds. Phone.NUMBER)); String image_uri = phoneCursor .getString(phoneCursor .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI)); if (image_uri != null) { Toast.makeText(context, "Toast 4", Toast.LENGTH_SHORT).show(); System.out.println(Uri.parse(image_uri)); try { bitmap = MediaStore.Images.Media .getBitmap(this.getContentResolver(), Uri.parse(image_uri)); // sb.append("\n Image in Bitmap:" + bitmap); // System.out.println(bitmap); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Toast.makeText(context, name, Toast.LENGTH_SHORT).show(); getDataInList(name,phoneNo,bitmap); name=null; phoneNo=null; Drawable myDrawable = getResources().getDrawable(R.drawable.star1); bitmap = ((BitmapDrawable) myDrawable).getBitmap(); } phoneCursor.close(); } } } 

Здесь функция setAdapter () в listview работает после извлечения всех контактов в ArrayList. Есть ли у кого-нибудь представление о том, как отображать контакты во время извлечения контактов? Любой пример кода?

1. Просмотрите столбцы из Cursor который вам нужен только. В соответствии с вашим требованием вам просто нужно _ID, HAS_PHONE_NUMBER, DISPLAY_NAME , поэтому измените показание курсора

 Cursor cursor = getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.HAS_PHONE_NUMBER, ContactsContract.Contacts.DISPLAY_NAME }, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC"); 

2. Не выполняйте процесс времени в потоке пользовательского интерфейса. AsyncTask этого используйте AsyncTask

Примечание . Эти два шага будут устранены в некоторой степени … но не полностью

Контакты в малом размере используются в фоновой задаче. Uri uri = Uri.withAppendedPath (ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode (номер [i]));

  ContentResolver contentResolver = getContentResolver(); Cursor search = contentResolver.query(uri, new String[]{ContactsContract.PhoneLookup._ID, ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); try { if (search != null && search.getCount() > 0) { search.moveToNext(); name = search.getString(search.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); id = search.getString(search.getColumnIndex(ContactsContract.Data._ID)); System.out.println("name" + name + "id" + id); /* tv_name.setText(name); tv_id.setText(id); tv_phone.setText(number);*/ } } finally { if (search != null) { search.close(); } } 

Самый быстрый способ для меня очень далеко.

 ContentResolver cr = mContext.getContentResolver(); Cursor cursor= mContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, PROJECTION, "HAS_PHONE_NUMBER <> 0", null, null); if (cursor!= null) { final int displayNameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); final int numberIndex = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER); final int idIndex= cursor.getColumnIndex(ContactsContract.Contacts._ID); String displayName, number = null, idValue; while (cursor.moveToNext()) { displayName = cursor.getString(displayNameIndex); idValue= cursor.getString(idIndex); Cursor phones = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, "contact_id = '" + idValue + "'", null, null); phones.moveToFirst(); try { number = phones.getString(phones.getColumnIndex("data1")); } catch (CursorIndexOutOfBoundsException e) {` } phones.close(); userList.add(new ContactModel(displayName , number , null , } 
Intereting Posts
Непрерывная интеграция для Android через TeamCity. Предпочтительные инструменты? Установить ширину WebView для упаковки содержимого HTML? TYPE_ACCELEROMETER Удалите гравитацию, значение t / (t + dT) Как узнать, что устройство подключено к Wi-Fi или 3G, программно Фрагмент назад стек и isRemoving () Использовать тег таблицы в электронной почте Android Обновление списков изображений ListView для Android ListView с использованием AsyncTask Причины Просмотр утилизации Можно ли использовать JPCAP с Android? Члены класса в фрагменте становятся нулевыми после нажатия кнопки «Домой» и ожидания Ошибка отображения с фронтальной камерой, видео и видеоизображением в Adobe AIR (Flex 4.6.0) для Android Как заставить приложение выглядеть одинаково на всех устройствах? Открыть .txt-приложение из электронной почты в приложении Android Приложение не поступает по почте программно Как сделать линейную компоновку горизонтальной прокрутки Android.view.ViewGroup $ LayoutParams нельзя отбрасывать в android.widget.AbsListView $ LayoutParams