Autore Topic: Cambio texview da Thread  (Letto 961 volte)

Offline plinius76

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Iped
  • Play Store ID:
    Giuseppe Boccolato
Cambio texview da Thread
« il: 03 Gennaio 2011, 01:01:50 CET »
0
Ciao,
Sto utilizzando un worker thread per fare un download di alcuni video da un server remoto.
La copia funziona perfettamente ma voglio visualizzare un messaggio ogni file copiato.(in attesa di inserire una barra che indica la percentuale)
Il problema è che non so come mai, inoltro un messaggio all'handler chiuso in un bundle che viene correttamente ricevuto e parsato da handleMessage().
il fatto è che nella funzione handleMessage() chiamo la SetTex per un Texview che sembra fregarsene di cambiare contenuto... o meglio... lo schermo rimane nero finche non termina il thread..
Secondo voi potrebbe essere perché succhio troppe risorse? (mi sembra strano)
oppure perché ho ridefinito la run del trhead alla quale sto passando dei parametri?


Codice: [Seleziona]
class MyThread extends Thread {
          private Handler handler;
          private int FilmCopiati=0,FilmTotali=0;
          private float PercentualeFilm=0;
          public MyThread(Handler handler) {
            this.handler = handler;
          }
          public ParserParametri Parametri;
          public String PATH;
          public void run(ParserParametri Par,String Path) {
      Parametri=Par;
          PATH = Path;
          for(int i=0;i<Parametri.NumeroSettori;i++)//ciclicamente copia tutti i files
          for(int j=0;j<Parametri.FilmatiSettore[i];j++)FilmTotali++;
          for(int i = 0;i<Parametri.NumeroSettori;i++)//ciclicamente copia tutti i files
                 {
                   for(int j = 0;j<Parametri.FilmatiSettore[i];j++)
                            {
                     DownloadFromUrl("sector"+(i+1)+"_"+(j+1)+".mp4","sector"+(i+1)+"_"+(j+1)+".mp4");
                     FilmCopiati++;
                     PercentualeFilm=(float) FilmCopiati/FilmTotali;
                     AvanzaPercentuale(PercentualeFilm);
                     }
             }
             FineCopia("comunica fine"); 
          }

          private void FineCopia(String str) {
                    Message msg = handler.obtainMessage();
                    Bundle b = new Bundle();
                    b.putString("EndCopy", ""+str);
                    msg.setData(b);
                    handler.sendMessage(msg);
                  }
          private void AvanzaPercentuale(float PercentualeFilm) {
                    Message msg = handler.obtainMessage();
                    Bundle b = new Bundle();
                    b.putFloat("numfile",PercentualeFilm);
                    msg.setData(b);
                    handler.sendMessage(msg);
                  }
         
          public void DownloadFromUrl(String videoName, String fileName) {
                         
                         try{
                                 URL url = new URL(Parametri.PathServer + videoName);
                                 File file = new File(PATH+fileName);
                     URLConnection ucon = url.openConnection();
                     InputStream in = ucon.getInputStream();
                     int len = 0;
                     byte[] buffer = new byte[1024];
                     FileOutputStream fos = new FileOutputStream(file);
                     while ((len = in.read(buffer)) > 0) {
                             fos.write(buffer,0, len);
                             }
                         fos.close();                       
                         }
                         catch (IOException e) {
                     Log.d("VideoUpload", "Error: " + e);
                         }   
                 
                 }
        }

Nell'activity ho una inner class che riceve il messaggio....
Codice: [Seleziona]
        private class MyHandler extends Handler {
            @Override
            public void handleMessage(Message msg) {
              Bundle bundle = msg.getData();
              if(bundle.containsKey("EndCopy")) {   
                  Toast.makeText(io, "Fine copia",Toast.LENGTH_SHORT).show();
                  Thread moribund = thr;
                            thr = null;
                            moribund.interrupt();
                            finish();
                } 
              if(bundle.containsKey("numfile")) {
                      Toast.makeText(io, "sono alla percentuale"+bundle.getFloat("numfile"),Toast.LENGTH_SHORT).show();
             
              }
            }
          }       


Sapete darmi qualche indicazione?

ciao e grazie

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Cambio texview da Thread
« Risposta #1 il: 03 Gennaio 2011, 01:14:43 CET »
+1
Se tutto questo codice è contenuto in una activity prova ad utilizzare il metodo runOnUiThread
http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

Del tuo codice non mi convince molto che l'handler è stato dichiarato dentro il thread. Sappi inoltre che non c'è bisogno che interrompi tu il thread, una volta che arriva alla fine si interrompe da solo.


PS: Perchè non hai usato un AsyncTask??
« Ultima modifica: 03 Gennaio 2011, 01:17:29 CET da Ricky` »

Offline plinius76

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Iped
  • Play Store ID:
    Giuseppe Boccolato
Re:Cambio texview da Thread
« Risposta #2 il: 03 Gennaio 2011, 09:50:47 CET »
0
Grazie gli do un occhiata subito....
per il thread hai ragione, è rimasta l'interruzione dal while che ho tolto prima di postare il codice..
Cmq non va disallocato il thread? ci pensa Android a riottenere la memoria?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re: Cambio texview da Thread
« Risposta #3 il: 03 Gennaio 2011, 12:04:38 CET »
0
Quando viene ultimato il metodo run il thread viene automaticamente distrutto...

Sent from my HTC Desire using Tapatalk

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Cambio texview da Thread
« Risposta #4 il: 03 Gennaio 2011, 13:28:18 CET »
0
Grazie gli do un occhiata subito....
per il thread hai ragione, è rimasta l'interruzione dal while che ho tolto prima di postare il codice..
Cmq non va disallocato il thread? ci pensa Android a riottenere la memoria?
In generale, in Java non hai bisogno di deallocare niente, perché a fare questo ci pensa il Garbage Collector .
Quando un processo o comunque qualcosa che occupi memoria non viene utilizzato o referenziato, il GC provvede a rendere libera la sua memoria occupata.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline plinius76

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Iped
  • Play Store ID:
    Giuseppe Boccolato
Re:Cambio texview da Thread
« Risposta #5 il: 03 Gennaio 2011, 13:56:17 CET »
0
Ciao, risolto!!! O:-)
l'errore del mio codice era banalissimo :-[
non posso invocare il metodo run e cambiarlo... il thread si avvia con .start() e nel costruttore devo passare i parametri che mi servono!!
ho capito che è sbagliato lavorare la sera dalle 11.00pm alle 2.00 am  8-)

Grazie comunque per il messaggio, è molto utile runOnUiThread(java.lang.Runnable)
evita tutti i problemi dello scambio messaggi!

ciao

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Cambio texview da Thread
« Risposta #6 il: 04 Gennaio 2011, 02:19:14 CET »
0
Ciao, risolto!!! O:-)

Ottimo :)

PS
Dai un'occhiata alla mia firma ;)
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline plinius76

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Iped
  • Play Store ID:
    Giuseppe Boccolato
Re:Cambio texview da Thread
« Risposta #7 il: 04 Gennaio 2011, 10:07:17 CET »
0
Ops... pensavo di averlo già fatto :)
ciao