Autore Topic: Velocizzare elaborazione dati  (Letto 943 volte)

Offline lelletta

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Velocizzare elaborazione dati
« il: 25 Aprile 2012, 14:59:26 CEST »
0
Ho una galleria di immagini. Queste immagini sono memorizzate nel DB ( solo l'uri). Ad esempio ogni volta che eseguo click su Galleria si apre una griglia di immagini ad icone ( cioè le immagine subiscono una trasformazione: angoli arrotondati, ridimensionamento, ombra). Il "problema"  è che l'apertura impiega tipo 5-6 sec.!
Cosa posso fare per velocizzare tale apertura?
Grazie :-P

Offline qato

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 5
Re:Velocizzare elaborazione dati
« Risposta #1 il: 26 Aprile 2012, 08:15:50 CEST »
0
Immagino che stai usando una Gallery e quindi un Adapter per popolarlo giusto?
Probabilmente dovresti solo implementare un AsyncTask per eseguire il download
Se posti un po di codice, forse è meglio ;)

Offline lelletta

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:Velocizzare elaborazione dati
« Risposta #2 il: 26 Aprile 2012, 20:06:23 CEST »
0
Codice (Java): [Seleziona]
                db = new MyDatabase(getApplicationContext());
                db.open();
                Cursor cc = db.fetchImgP();
                startManagingCursor(cc);
                setContentView(R.layout.img_personali);
                gridview = (GridView) findViewById(R.id.gridview);
                _imageAdapter = new ImgAdapter(this, cc);
                gridview.setAdapter(_imageAdapter);
                db.close();


Questo è il codice. Come lo gestisco con l'AsyncTask?

Offline qato

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 5
Re:Velocizzare elaborazione dati
« Risposta #3 il: 27 Aprile 2012, 08:07:04 CEST »
+1
In realtà sarebbe stato meglio vedere l'adapter :)
Comunque, nel getView dell'adapter, invece di fare li il download dell'immagine, ritorni il puntatore alla bitmap e fai partire un AsyncTask che esegue il download dall'URL, e solo quando è terminato, quindi nella onPostExecute, esegui il setImageBitmap.
Se devi però eseguire il download di molte immagini, questa soluzione potrebbe causare un eccesivo numero di thread aperti senza considerare che potrebbe risultare poco efficente lato utente, se viene eseguito uno scroll, le ultime immagini non le visualizzerà finché l'app non ha scaricato le precedenti.
In questo caso potrebbe essere meglio abbandonare AsycTask e creare un runnable per il download con un pool di thread preferibilmente LIFO (last-in-first-out) così che l'ultima immagine inserita sia la prima ad essere scaricata e visualizzata. L'app risulterà così più "reattiva"

 

Offline lelletta

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:Velocizzare elaborazione dati
« Risposta #4 il: 27 Aprile 2012, 17:38:17 CEST »
0
le immagini sono una 10ina ma a volte anche di più...adesso mi documento circa la seconda soluzione che mi hai proprosto!
grazie :-P

Offline lelletta

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:Velocizzare elaborazione dati
« Risposta #5 il: 29 Aprile 2012, 12:33:50 CEST »
0
Codice (Java): [Seleziona]
new Thread() {
                        public void run() {
                                db.open(); // apriamo il db
                                cc = db.fetchImg();
                                startManagingCursor(cc);
                                _imageAdapter = new ImgAdapter(getApplicationContext(), cc);
                                gridview.setAdapter(_imageAdapter);
                                db.close();
                        pd.dismiss(); }
                        }.start();
se faccio semplicemento così cosa ne pensi?
il pb è che vorrei che il processdialog partisse ne momento in cui faccio click sun button (che si travo in altra activity rispetta a quella in cui sto lavorando) invece parte solo dopo che ha eseguito le operazioni è quindi lo si intravede per 1 sec.
In sostanza vorrei semplicemente che mentre esegue le oprezaioni si veda un processDialog..

Offline qato

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 5
Re:Velocizzare elaborazione dati
« Risposta #6 il: 01 Maggio 2012, 10:40:52 CEST »
0
Probabilmente la getView viene sempre invocata dal thread UI, quindi l'effeto "lentezza" resta, ma è da provare ;)

Offline lelletta

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:Velocizzare elaborazione dati
« Risposta #7 il: 02 Maggio 2012, 20:18:04 CEST »
0
infatti è così...ma se io volessi solo mentre carica vedere un processidialog?

Offline qato

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 5
Re:Velocizzare elaborazione dati
« Risposta #8 il: 04 Maggio 2012, 08:27:30 CEST »
0
Scusa del ritardo :)
Dovresti aggiornare lo status sempre nel metodo onPostExecute dell'AsyncTask, se invece non vuoi usare l'AsyncTask credo basti aggiornare il progress all'interno della getView dell'adapter