Autore Topic: contatti, lentezza nel recuperarli  (Letto 733 volte)

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
contatti, lentezza nel recuperarli
« il: 09 Ottobre 2012, 01:31:32 CEST »
0
Non so se sia la sezione giusta, penso di si.

Allora devo recuperare la lista di tutti i contatti e prendere solo chi ha un nome e se ha un email oppure un numero di telefono.
Non è un problema prelevarli nel senso che ci sono riuscito ma è tutto molto lento, almeno 50 secondi.
Nel cellulare mi vengono  1267 e ne ottengo 659 con email o numero.
Sto usando un AsyncTask e alla fine creo un ArrrayList che passo ad un adapter. Lo so che esiste il CursorAdaptor ma a me serve solo nome, email o numero di telefono e devo soffisfare la condizione che ho scritto sopra.
Ecco il codice.

Codice (Java): [Seleziona]
public class ContactsTask extends
                        AsyncTask<Void, Void, ArrayList<ContactModel>> {

               

                @Override
                protected ArrayList<ContactModel> doInBackground(Void... params) {
                        ArrayList<ContactModel> contatti = new ArrayList<ContactModel>();
                        Cursor cursor = getContentResolver().query(
                                        ContactsContract.Contacts.CONTENT_URI, null, null, null,
                                        null);

                        int count = 0;
                        while (cursor.moveToNext()) {
                                count += 1;
                                ContactModel contatto = new ContactModel();
                                String contactId = cursor.getString(cursor
                                                .getColumnIndex(ContactsContract.Contacts._ID));

                                String name = cursor
                                                .getString(cursor
                                                                .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                                contatto.setName(name);
                                boolean hasPhone = Integer
                                                .parseInt(cursor.getString(cursor
                                                                .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0;

                                if (hasPhone) {

                                        Cursor phones = getContentResolver().query(
                                                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                                        null,
                                                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                                                        + " = " + contactId, null, null);
                                        while (phones.moveToNext()) {
                                                String phoneNumber = phones
                                                                .getString(phones
                                                                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                                                contatto.setNumber(phoneNumber);

                                        }
                                        phones.close();
                                }
                       
                                Cursor emails = getContentResolver().query(
                                                ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                                                null,
                                                ContactsContract.CommonDataKinds.Email.CONTACT_ID
                                                                + " = " + contactId, null, null);
                                while (emails.moveToNext()) {

                                        String emailAddress = emails
                                                        .getString(emails
                                                                        .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

                                        contatto.setEmail(emailAddress);
                                }
                                emails.close();

                                if (hasPhone || contatto.getEmail().length() > 5) {
                                        contatti.add(contatto);
                                }

                        }
                        cursor.close();
                        Dbg.p("Count: " + count);
                        return contatti;
                }
               
                @Override
                protected void onPostExecute(ArrayList<ContactModel> result) {
                        super.onPostExecute(result);

                        // qui passo l' ArrayList all' adapter e creo la lista.

                }

        }

La domanda stupida è quella che non si fa

Offline Phate

  • Utente junior
  • **
  • Post: 123
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S
  • Sistema operativo:
    Windows 7
Re:contatti, lentezza nel recuperarli
« Risposta #1 il: 09 Ottobre 2012, 09:58:41 CEST »
0
Mmm..se ci mette tempo ci mette tempo, però io ti direi di tornare sui cursor adapters per non fare il passaggio di conversione che cmq ti prende tempo, oltre ad essere perfettamente inutile.

Nella query del cursor adapter basta che giochi con gli argomenti di select e where per ottenere esattamente la lista che ti serve! E se hai esigenze particolari di visualizzazione basta che estendi la classe CursorAdapter e il gioco è fatto! ;)

Ecco qua:
Codice (Java): [Seleziona]
Cursor cursor = getContentResolver().query(
                                        ContactsContract.Contacts.CONTENT_URI, null, "nome <>'' AND (email <>'' OR telefono <>'')", null,
                                        null);

questa query fa esattamente quello che vuoi: estrae dal db solo gli utenti il cui nome sia diverso da niente (quindi metterai come default '' nella creazione della tabella al campo nome) e che, soddisfatta questa condizione, abbiano o email o telefono diversi da niente.
Molto più efficiente del tuo approccio ;) .
« Ultima modifica: 09 Ottobre 2012, 10:04:40 CEST da Phate »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:contatti, lentezza nel recuperarli
« Risposta #2 il: 09 Ottobre 2012, 10:21:19 CEST »
0
Ci sarebbe da ottimizzare un po' il codice per migliorare la situazione.


Usa le projections per fare la query solo sulle colonne che effettivamente ti servono:

Codice (Java): [Seleziona]
private static final String[] PROJECTION = new String[] {
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.DISPLAY_NAME,
    ContactsContract.Contacts.HAS_PHONE_NUMBER
};
Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, null, null, null);


Puoi precaricare i columnindex una sola volta invece che ogni volta che cicli:

Codice (Java): [Seleziona]
   int count = 0;                      
   final int contactIdIndex = cursor.getColumnIndex(ContactsContract.Contacts._ID);
   final int displayNameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
   final int hasPhoneIndex = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
   while (cursor.moveToNext()) {


Stessa cosa eventualmente per le due sotto-query.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
Re:contatti, lentezza nel recuperarli
« Risposta #3 il: 09 Ottobre 2012, 10:38:46 CEST »
0
Ok provo ad ottimizzare e vediamo se posso usare il CursorAdataper, il fatto che la lista deve mostrare o i contatti della rubrica o i contatti di facebook o altri contatti passati dal server quindi con un custom adapter avevo risolto...
La domanda stupida è quella che non si fa

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
Re:contatti, lentezza nel recuperarli
« Risposta #4 il: 09 Ottobre 2012, 10:45:21 CEST »
0
Citazione
Puoi precaricare i columnindex una sola volta invece che ogni volta che cicli:


Si grazie di solito lo faccio per le query su db :)
La domanda stupida è quella che non si fa

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
Re:contatti, lentezza nel recuperarli
« Risposta #5 il: 09 Ottobre 2012, 11:09:22 CEST »
0
Grazie bradipao, con i columnindex la differenza era poca ma con le projection ho quasi dimezzato il tempo a 22 secondi e cmq ho 1200 contatti :)
La domanda stupida è quella che non si fa