Autore Topic: decodeFile da un Thread secondario  (Letto 446 volte)

Offline TheFedex87

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Windows 7/8
decodeFile da un Thread secondario
« il: 23 Gennaio 2015, 17:24:03 CET »
0
Salve a tutti. Mi trovo difronte a questo problema: la mia applicazione all'avvio di una determinata activity, deve recuperare da un DataBase alcuni nomi di immagini salvata all'interno di una directory. Una volta recuperata la lista, deve apparire a video una preview (che viene caricata su una GridView) di queste immagini. Per fare ciò utilizzo il metodo decodeFile della classe BitmapFactory e una volta decodificate le carico nella grdiview passando per il mio ImageAdapter. Il problema è che quando le immagini cominciano ad essere un discreto numero, vedo che ci mette un bel pò prima di aprire l'activity. Allora ho pensato di fare eseguire questa codifica in un thread secondario e non nel thread pricincipale della activity. Inizialmente mi sono limitato a creare un secondo thread, ma ho ovviamente ottenuto l'errore che solo il main thread che ha generato le view può modificarle. Allora ho provato ad usare il metodo runOnUiThread ma in questo caso ho visto che si funziona, ma sono tornato al punto di prima: ci mette molto ad aprire l'activity, come se questo metodo mettesse comunque in attesa il main thread. A questo punto ho 2 domande:
1 - Se effettivamente il metodo runOnUiThread mette in "attesa" il main thread, quale è la sua reale utilità? A quel punto non conviene far eseguire il codice direttamente al thread principale allora?
2 - Come posso ricolvere il mio problema di fare caricare subito l'activity senza che ci metta una eternità ad aprirsi?
Grazie ;)

Offline TheFedex87

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Windows 7/8
Re:decodeFile da un Thread secondario
« Risposta #1 il: 26 Gennaio 2015, 12:26:54 CET »
0
Ok, penso di potermi rispondere da solo. Mi sono fatto una idea più chiara di tutta la situazione. Ho capito come usare il metodo runOnUIThread permettendo il caricamento rapido della activity ma lasciando che un processo in background faccia la decodifica dei file Bitmap.
A questo punto ho un'altra domanda, come determinare cosa utilizzare per effettuare una determinata operazione? Ad esempio nel mio caso specifico spiegato al primo post, cosa è maggiormente profittevole usare?
runOnUIThread? (che è quello che sto usando attualmente)
Utilizzare gli handler?
Utilizzare gli AsyncTask?

Offline Semola

  • Utente junior
  • **
  • Post: 55
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Nexus 6P
  • Sistema operativo:
    Ubuntu 13.04 on Dell XPS 14
Re:decodeFile da un Thread secondario
« Risposta #2 il: 26 Gennaio 2015, 15:40:47 CET »
0
se le immagini le tieni in locale e non devi effettuare un download, e se il database è locale e non remoto, secondo me puoi fare anche un unico asynctask, o thread come preferisci, per fare tutto; altrimenti se devi fare operazioni pesanti su ogni immagine, tipo resize o simili, puoi fare un thread per ogni immagine.
poi dipende anche da quante immagini devi caricare, se si tratta di centinaia, non ti conviene caricarle tutte insieme, puoi caricarle magari dieci per volta e quando arrivi alla fine del gridlayout ne carichi altre dieci e così via.

Offline TheFedex87

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Windows 7/8
Re:decodeFile da un Thread secondario
« Risposta #3 il: 26 Gennaio 2015, 15:54:19 CET »
0
No, sia le immagini che il db risiede tutto in locale. Le immagini vengono direttamente scattate dalla fotocamera del telefono e poi vengono visualizzate in miniatura sul GridView (poi al click sopra l'immagine si apre nella sua dimensione naturale). Tieni conto che non ci sono tantissime immagini da caricare (ma dipende alla fine da quante l'utente decide di scattarne). Tuttavia quello che ora mi interessa capire come chiedevo sopra, è come capire se utilizzare gli handler, o gli asynctask oppure sfruttare direttamente il metodo RunOnUiThread. Cioè in base a quali criteri posso basare la mia scelta? Penso che una prima distinizione fra il metodo runOnUiThread e le altre 2 (handler e AsyncTask) poss essere fatta in base alla elaborazione da fare, nel senso se le operazioni sono molte, o pesanti e complesse conviene lasciare stare il main thread /quindi non usare runOnUiThread e appoggiarsi agli handler o agli AsyncTask, ma come sapere se utilizzare appunti gli handler o gli AsyncTask in caso di operazioni complesse?

Offline Semola

  • Utente junior
  • **
  • Post: 55
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Nexus 6P
  • Sistema operativo:
    Ubuntu 13.04 on Dell XPS 14
Re:decodeFile da un Thread secondario
« Risposta #4 il: 26 Gennaio 2015, 16:00:59 CET »
0
forse forse questo può chiarirti un pò le idee
Differenza fra AsyncThread ed Handler - Android Developers Italia

Offline TheFedex87

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Windows 7/8
Re:decodeFile da un Thread secondario
« Risposta #5 il: 26 Gennaio 2015, 16:11:10 CET »
0
forse forse questo può chiarirti un pò le idee
Differenza fra AsyncThread ed Handler - Android Developers Italia
Grazie ;) ... mi era sfuggito questo post

Offline Semola

  • Utente junior
  • **
  • Post: 55
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Nexus 6P
  • Sistema operativo:
    Ubuntu 13.04 on Dell XPS 14
Re:decodeFile da un Thread secondario
« Risposta #6 il: 26 Gennaio 2015, 16:29:26 CET »
0
di nulla  ;-)