Autore Topic: Listview con immagini lag  (Letto 514 volte)

Offline scemodicecosa

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
Listview con immagini lag
« il: 19 Febbraio 2015, 10:25:59 CET »
0
Salve a tutti, sto creando un app che mi permette di creare un database con informazioni e foto relative a delle piante inserite dall'utente utilizzando uno sqlitedatabase. Le foto in particolare vengono scelte dalla galleria, copiate in una nuova cartella e poi salvo il percorso delle foto nel database così quando servono le richiamo dal loro path. E fino a qua tutto bene ad eccezione di foto molto grandi che per aprire dalla listview la scheda relativa ci mette un po' di più rispetto ad altre schede con foto con risoluzione più bassa.
Inoltre volevo implementare una miniatura accanto al nome nella listview e mi era stato suggerito di usare picasso per ridimensionarle 50x50 così ho usato un custom cursor adapter
Codice (Java): [Seleziona]
public class WeedCursorAdapter extends SimpleCursorAdapter
{
        private Context context;
        static RegistrationOpenHelperW database_ob;
        RegistrationAdapterW adapter_db;
 
       
       
   
    static String[] from = { database_ob.NAME , database_ob.IMG1};
    static int[] to = { R.id.tv_fnamew, R.id.img_row_w};
   
        public WeedCursorAdapter(Context context, Cursor c)
        {
                super(context, R.layout.row_w, c, from, to );
                this.context = context;
        }
 
        @Override
        public void bindView(View view, Context context, Cursor cursor)
        {
                super.bindView(view, context, cursor);
                ImageView img1 = (ImageView) view.findViewById(R.id.img_row_w);
                Picasso.with(context)
                .load("file://" + cursor.getString(4))
                .resizeDimen(R.dimen.miniature_size, R.dimen.miniature_size)
                .into(img1);
               
                img1.setImageBitmap(BitmapFactory.decodeFile(cursor.getString(4)));
        }
}
Le foto si inseriscono correttamente ma lo scroll della lista diventa impossibile perchè lagga in una maniera indecente, probabilmente perchè ogni volta che compare un nuovo elemento a schermo l'app deve rifare tutto questo procedimento. Ho sbagliato io il codice per il cursor adapter oppure ci sono altre soluzioni?.
Grazie mille

Offline alfy91

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +2
    • @piscitelli91
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 8
Re:Listview con immagini lag
« Risposta #1 il: 19 Febbraio 2015, 12:51:22 CET »
0
Ciao
il lag credo sia dovuto al fatto che le immagini sono troppo pesanti... quindi il processore lo impegni anche a fare calcolo per ridurla di dimensione e sostituirla... a mio avviso sarebbe meglio che nel db e nel sistema ti salvi direttamente la miniatura. Così è più veloce e non deve aprire tutte le foto insieme, ma le apre solo quando apri il dettaglio. Questa cosa te la consiglio anche perché un domani che la tua app fosse eseguita su dispositivi meno performanti di un nexus 4, la listview non andrebbe in lag ma crasha proprio :D

PS. non c'entra con la domanda, ma se le foto le avresti dovute scaricare da internet la mia soluzione era un must, altrimenti correvi il rischio di consumare molti MB di una connessione non flat.

Facci sapere.

Offline Blodhgard

  • Utente junior
  • **
  • Post: 53
  • Respect: +3
    • Mostra profilo
    • Budget Veloce
  • Dispositivo Android:
    Nexus 5, S4 mini, Galaxy Tab S
  • Play Store ID:
    blodhgard
  • Sistema operativo:
    Windows 8.1
Re:Listview con immagini lag
« Risposta #2 il: 19 Febbraio 2015, 16:36:26 CET »
0
Potresti utilizzare un viewholder per aumentare leggermente la velocità, anche se nel tuo caso è un problema legato alle immagini probabilmente.
Prova a precaricare le immagini prima che avvenga lo scroll, se non tutte almeno le prime non visibili.

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Listview con immagini lag
« Risposta #3 il: 19 Febbraio 2015, 16:39:26 CET »
0
Credo che la lentezza non sia nella resize di Picasso che è asincrona (e che inoltre dovrebbe cachare su disco, una volta miniaturizzato), ma piuttosto la BitmapFactory.decodeFile(), che te lo ricarica da disco.

Ti consiglio di leggerti tutto questo: http://developer.android.com/training/displaying-bitmaps/index.html in particolare "Caching Bitmap"
Dovresti trovare un po' di cose interessanti.

Ciao

Post unito: 19 Febbraio 2015, 16:42:22 CET
P.S. Mi sfugge una cosa, metti una miniatura in una riga della listview e anche la sua immagine a dimensione piena? A che serve?
Se vuoi caricare in modo asinrono puoi usare Picasso anche per quella "grande", basta togliere la riga "resize".
« Ultima modifica: 19 Febbraio 2015, 16:42:22 CET da arlabs, Reason: Merged DoublePost »

Offline scemodicecosa

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
Re:Listview con immagini lag
« Risposta #4 il: 19 Febbraio 2015, 17:08:58 CET »
0
Credo che la lentezza non sia nella resize di Picasso che è asincrona (e che inoltre dovrebbe cachare su disco, una volta miniaturizzato), ma piuttosto la BitmapFactory.decodeFile(), che te lo ricarica da disco.

Ti consiglio di leggerti tutto questo: http://developer.android.com/training/displaying-bitmaps/index.html in particolare "Caching Bitmap"
Dovresti trovare un po' di cose interessanti.

Ciao

Post unito: [time]19 Febbraio 2015, 16:42:22 CET[/time]
P.S. Mi sfugge una cosa, metti una miniatura in una riga della listview e anche la sua immagine a dimensione piena? A che serve?
Se vuoi caricare in modo asinrono puoi usare Picasso anche per quella "grande", basta togliere la riga "resize".
In che senso metto anche l'immagine a dimensione piena? Nella riga volevo mettere una miniatura, mente poi cliccando sulla riga si apre la scheda con l'immagine a dimensione effettiva.  Inoltre avevo pensato di fare così: quando inserisco un immagine alla relativa pianta ne creo una copia in un'altra cartella come di consueto e poi faccio un'altra copia però di dimensioni 50x50 e carico quella nella riga. Visto che sostituendo le immagini con delle miniature ho notato che migliora sensibilmente lo scroll. Adesso comunque mi leggo bene il link che mi hai mandato e vedo cosa ne riesco a tirare fuori.

EDIT: Ho capito cosa dicevi arlabs, ho levato l'ultima riga che era rimasta non so perchè, adesso lagga di meno ma comunque non è fluida perchè sembra che comunque ogni volta che scorro la lista ricarichi l'immagine. Cosa potrei fare?
« Ultima modifica: 19 Febbraio 2015, 17:38:32 CET da scemodicecosa »

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Listview con immagini lag
« Risposta #5 il: 20 Febbraio 2015, 11:47:52 CET »
0
Se non era tua intenzione mettere l'immagine piena, non hai bisogno di leggere il link.

La riga seguente:
Codice (Java): [Seleziona]
    img1.setImageBitmap(BitmapFactory.decodeFile(cursor.getString(4)));
nella bind view, ti ricarica tutte le immagine per ogni riga. Ho notato ora che l'associ alla stessa ImageView che dai a Picasso. Semplicemente commenta quella riga, diverrà tutto fluidissimo... ;)

Post unito: 20 Febbraio 2015, 11:49:29 CET
Ok, ho letto ora l'edit... strano che laggi perché Picasso dovrebbe caricare in un thread a parte, non dovresti vedere le immagini immediatamente quando scrolli, ma comunque non rallentarti.
« Ultima modifica: 20 Febbraio 2015, 11:49:29 CET da arlabs, Reason: Merged DoublePost »

Offline scemodicecosa

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
Re:Listview con immagini lag
« Risposta #6 il: 20 Febbraio 2015, 13:15:16 CET »
0
Adesso quando inserisco una nuova scheda e selezione una nuova immagine creo una copiae scalata creandola di altezza 128 e base che rimane in proporzione e la setto come immagine della riga usando .fit().centerCrop() perchè altrimenti picasso distorceva anche l'immagine. Anche se adesso sono incappato in un nuovo problema di codice che posterò in un'altra sezione

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Listview con immagini lag
« Risposta #7 il: 20 Febbraio 2015, 14:11:18 CET »
0
usa centerCrop() o centerInside().

[Edit] Il mio solito vizio di non leggere le mail con attenzione... :(
[RiEdit] No aspetta, forse non avevo capito male, usi la centerCrop() di Picasso, vero?
« Ultima modifica: 20 Febbraio 2015, 14:13:59 CET da arlabs »

Offline scemodicecosa

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
Re:Listview con immagini lag
« Risposta #8 il: 20 Febbraio 2015, 15:16:57 CET »
0
si
Codice (Java): [Seleziona]
Picasso.with(context)
                .load("file://" + cursor.getString(6))
                .fit()
                .centerCrop()
                .into(img1);