Autore Topic: Aiuto per ottimizzazione codice  (Letto 911 volte)

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Aiuto per ottimizzazione codice
« il: 07 Marzo 2011, 00:58:28 CET »
0
Ciao a tutti, ho buttato giù un codice che legge i contatti in rubrica e li presenta all'utente tramite una listview mettendo doppi quei contatti che hanno più di un numero di telefono. L'unico problema è che impiega un pochino troppo a visualizzare la schermata forse perchè ho usato dei cicli for e dei Maps. Qualcuno mi ha consigliato di usare un SimpleCursorAdapter ma onestamente non sò proprio come fare, chi mi dà una mano ? :( ecco il codice :
Codice (Java): [Seleziona]
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.rubrica);
SimpleAdapter adapter = new SimpleAdapter(this, list(), R.layout.row_rubrica, new String[]{"nome","numero"}, new int[]{R.id.NomeC,R.id.TelefonoC});
getListView().setAdapter(adapter);
}

ed ecco il metodo che preleva i contatti

Codice (Java): [Seleziona]
private List<? extends Map<String, ?>> list() {
                Map<String,String> numbers = null;
                Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, Contacts.DISPLAY_NAME);
                ArrayList<Map<String,String>> lista = new ArrayList<Map<String,String>>();
                while (cursor.moveToNext()) {
                        contactId = cursor.getInt(cursor.getColumnIndex(Contacts._ID));
                        String inte = Integer.toString(contactId);
                        String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                        String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

                        if (!Boolean.parseBoolean(hasPhone)) {
                                        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
                                        int n = phones.getCount();
                                        int i = 0;
                                        for(i=0;i<=n-1;i++){
                                                numbers = new HashMap<String,String>();
                                                numbers.put("nome", name);
                                                phones.moveToNext();
                                                String num = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                                    numbers.put("numero",num);
                                    numbers.put("id", inte);
                                    lista.add(numbers);
                                }
                                        phones.close();
                        }
                }
        cursor.close();
        return lista;
        }

ho guardato anche un pò in giro nei forum ma non c'è nulla a riguardo....GRAZIE

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Aiuto per ottimizzazione codice
« Risposta #1 il: 07 Marzo 2011, 16:12:25 CET »
0
Vedo che non c'è nessuno che abbia voglia di perdere un pochino di tempo :(
Qualcuno mi ha consigliato di usare il l'SQLiteQueryBuilder ma avete idea di come posso usarla con i content provider ContactsContract e ContactsContract.CommonDataKinds.Phone ??  :-\

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:Aiuto per ottimizzazione codice
« Risposta #2 il: 07 Marzo 2011, 16:26:23 CET »
+1
Vedo che non c'è nessuno che abbia voglia di perdere un pochino di tempo :(

Purtroppo non mi basta il tempo nemmeno per le mie di sperimentazioni.  :-(

Però ti rimando ad un tool molto poco usato ma perfetto per indagare i casi come il tuo: Profiling with Traceview and dmtracedump | Android Developers

Come vedi dall'immagine, ti mostra nel dettaglio dove la CPU "passa" il suo tempo.

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Aiuto per ottimizzazione codice
« Risposta #3 il: 07 Marzo 2011, 16:32:54 CET »
0
ciao bradi! il problema è che sò dove il mio codice passa il suo di tempo :D soltanto che pur volendo implementare come suggeritomi l'SQLiteQueryBuilder non ho idea di come posso farlo con i content provider ContactsContract e ContactsContract.CommonDataKinds.Phone

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Aiuto per ottimizzazione codice
« Risposta #4 il: 07 Marzo 2011, 16:40:54 CET »
0
Per quale motivo hai deciso di usare una struttura dati del genere?
Non potevi semplicemente crearti una classe Contatto con dentro il nome e un array per contenere i vari numeri?
Inoltre, non ti conviene portare i vari cursor.getColumnIndex fuori dal ciclio while, non serve che lo esegui ad ogni iterazione.

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Aiuto per ottimizzazione codice
« Risposta #5 il: 07 Marzo 2011, 17:01:52 CET »
0
Per quale motivo hai deciso di usare una struttura dati del genere?
Non potevi semplicemente crearti una classe Contatto con dentro il nome e un array per contenere i vari numeri?
Inoltre, non ti conviene portare i vari cursor.getColumnIndex fuori dal ciclio while, non serve che lo esegui ad ogni iterazione.

Ma questa linea di codice Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null); deve stare per forza nel while perchè devo ripetere la select per ogni contatto che ho in rubrica e devi prelevare in base al contactid passato i numeri di quel contatto. Per i cursor.getColumnIndex anche loro devono stare nel ciclo perchè variano contatto per contatto..

Per quanto riguarda la classe Contatto non ho capito cosa intendi..

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Aiuto per ottimizzazione codice
« Risposta #6 il: 07 Marzo 2011, 17:07:27 CET »
0
Per quanto riguarda la classe Contatto non ho capito cosa intendi..

Usare una struttura dati apposita(una classe) invece che quella "schifezza" che usi attualmente. ;)

Perchè poi
Codice (Java): [Seleziona]
                                        int i = 0;
                                        for(i=0;i<=n-1;i++){

doppia inizializzazione della variabile i e condizione su n-1? non ti bastava  fare <n ? in quel modo ad ogni iterazione deve calcolare pure l'n-1 oltre che testare la condizione.
Citazione
Per i cursor.getColumnIndex anche loro devono stare nel ciclo perchè variano contatto per contatto

Questo non è assolutamente vero...

« Ultima modifica: 07 Marzo 2011, 17:09:31 CET da Ricky` »

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Aiuto per ottimizzazione codice
« Risposta #7 il: 07 Marzo 2011, 18:11:41 CET »
0
Usare una struttura dati apposita(una classe) invece che quella "schifezza" che usi attualmente. ;)

Perchè poi
Codice (Java): [Seleziona]
                                        int i = 0;
                                        for(i=0;i<=n-1;i++){

doppia inizializzazione della variabile i e condizione su n-1? non ti bastava  fare <n ? in quel modo ad ogni iterazione deve calcolare pure l'n-1 oltre che testare la condizione.
Questo non è assolutamente vero..
Sulla i come non darti ragione :-)
sulla schifezza di codice...pure hai ragione,però dai è la mia prima applicazione! :(
Sulle columnIndex  dici che dovrei fare una cosa del tipo : fuori dal ciclo while
String nomecolonna1 = getColumIndex....
String nomecolonna2 = getColumIndex...
e poi nel while mettere nomecolonna1 e 2. . dici che è meglio?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Aiuto per ottimizzazione codice
« Risposta #8 il: 07 Marzo 2011, 18:13:48 CET »
0
Si sarebbe preferibile ;)

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re: Aiuto per ottimizzazione codice
« Risposta #9 il: 07 Marzo 2011, 21:49:29 CET »
0
ok adotto i tuoi consigli speriamo che migliorino le performance :-)

Sent from my GT-I9000 using Tapatalk

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Aiuto per ottimizzazione codice
« Risposta #10 il: 07 Marzo 2011, 21:56:42 CET »
0
Vediamo ;) Metti qualche traccimento per vedere se c'è una effettivo miglioramento.
Mi raccomando prova a modificare il codice rimuovendo l'HashMap. Questo genere di collections sono molto potenti ma allo stesso tempo costano in termini di performances.

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Aiuto per ottimizzazione codice
« Risposta #11 il: 08 Marzo 2011, 00:58:39 CET »
0
Ricky, stavo pensado, se usassi l'SQLiteQueryBuilder potrei costruirmi la query con gli appositi JOIN e poi con un SimpleCursorAdapter visualizzare gli elementi. Unico problema è che la classe l'SQLiteQueryBuilder come prima cosa vuole il settaggio delle tabelle coinvolte ed io gli dovrei indicare quelle a cui fanno riferimenti i content provider ContactsContract.CommonDataKinds.Phone e ContactsContract, sai per caso in questi casi come si fa ??

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re: Aiuto per ottimizzazione codice
« Risposta #12 il: 08 Marzo 2011, 07:52:46 CET »
0
Non puoi querare in content provider con sql...

Sent from my HTC Desire

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Aiuto per ottimizzazione codice
« Risposta #13 il: 08 Marzo 2011, 08:42:17 CET »
0
Ok ci ho provato :D

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re: Aiuto per ottimizzazione codice
« Risposta #14 il: 09 Marzo 2011, 08:11:03 CET »
0
Ok Ricky ho perso la nottata ma ho riscritto il codice togliendo gli ArrayList e Map ed usando 1 classe,ho sistemato le variabili ed ho utilizzato un thread diverso per il caricamento...diciamo che cosi ho recuperato un 3sec rispetto a prima un'attesa accettabile ora ;-)

Sent from my GT-I9000 using Tapatalk