Obtener contactos en android es muy lento

Había escrito un código para buscar el nombre del contacto, el número de teléfono y la imagen de los contactos y para mostrarlo en un listview en android. Está funcionando bien, pero toma más tiempo para cargar. He intentado utilizar multi-threading en algunas partes del código. Pero el tiempo de carga no se reduce.

Aquí está el método 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)); } 

Aquí está el código para buscar contactos:

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

Aquí la función setAdapter () del listview funciona después de buscar todos los contactos en un ArrayList. ¿Alguien tiene idea acerca de cómo mostrar los contactos durante la búsqueda de contactos? Cualquier código de ejemplo?

1.Leer las columnas del Cursor que usted requirió solamente, según su requisito usted apenas necesita _ID, HAS_PHONE_NUMBER, DISPLAY_NAME , así que cambie la lectura del cursor

 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. No realice el proceso de toma de tiempo en el hilo de la interfaz de usuario. Utilice AsyncTask en AsyncTask lugar.

Nota : Estos dos pasos se resolverán hasta cierto punto … pero no completamente

Los contactos en tamaño normal utilizan en tarea de backround. Uri uri = Uri.withAppendedPath (ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode (number [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(); } } 

La manera más rápida para mí soo lejos.

 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 , } 
  • Obtener contacto Foto basada en Teléfono de contacto Android - Ejemplo de trabajo
  • Importar contactos CSV en el teléfono Android 4
  • Uso de LibPhoneNumber google lib en Android
  • ¿Cómo actualizar el contacto existente?
  • Java.lang.IllegalStateException: No se pudo leer la fila x col x de CursorWindow. Asegúrese de que el Cursor se inicialice correctamente.contacts
  • Enviar SMS a través de PhoneGap en Android
  • ¿Cómo actualizar la empresa de contacto de Android?
  • Necesito llamar a un número perticular en los contactos
  • ¿Cómo utilizar yahoo contacto api en la aplicación android?
  • No se pueden obtener contactos con cuentas de gmail sincronizadas
  • Permiso de negación: apertura del proveedor com.android.providers.contacts.ContactsProvider2 de ProcessRecord en Android Studio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.