Autore Topic: Problema con gestione tra due thread e l'activity principale  (Letto 732 volte)

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Problema con gestione tra due thread e l'activity principale
« il: 27 Novembre 2010, 10:56:49 CET »
0
Buongiorno.
Spiego qual è il mio problema.
Nella mia applicazione mi sono creato un server a cui il client(lo smartphone) gli chiede tramite richiesta tcp di inviargli due file.
Per quanto riguarda il client mi sono creato dei thread (in alcuni file java fuori dall'activity principale) da lanciare nell'activity principale nel seguente modo:
Codice (Java): [Seleziona]
//!!!!!!!!!!!!THREAD COMUNICAZIONE CON IL SERVER!!!!!!!!!!!
                Thread cThread = new Thread(new TCPClientArticoli());
                cThread.start();
                Thread cThread2 = new Thread(new TCPClientLogSpesa());
                cThread2.start();


Dei file ricevuti (che vengono correttamente ricevuti nella sd del dispositivo) (sono due file xml che contengono dati serializzati) ne faccio del parsing e i risultati li inserisco in un db sqlite e poi li visualizzo in una listview.

Se uso l'sdk la listview visualizza i dati correttamente aggiornati inviati dal server.
Se uso lo smartphone la sincronizzazione con il server avviene regolarmente, i file vengono correttamente ricevuti, ma nella listview non visualizzo nulla. Se poi spengo il server e riapro il programma sul cell i dati sono correttamente visualizzati nella listview.

Non riesco a capire a cosa sia dovuto questo comportamento. Sembra che ancora prima che siano terminati i thread e che i file sia effettivamente scritti sulla sd il programma vada a caricare il nulla (non essendo magari completata la scrittura dei file sulla sd) nella listview.

C'è qualche modo per gestire il ciclo di vita dei thread e far si che il programma carichi i dati dai file solo dopo che siano stati effettivamente ricevuti del tutto, cioè che i due thread siano terminati. Non so un modo per mettere in pausa l'activity principale fino a quando i file siano stati del tutto ricevuti.

Spero di essere stato chiaro. Altrimenti chiedete pure chiarimenti.
Vi ringrazio come sempre.
Ciao.
« Ultima modifica: 27 Novembre 2010, 11:08:35 CET da Albe85 »

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Problema con gestione tra due thread e l'activity principale
« Risposta #1 il: 27 Novembre 2010, 12:05:07 CET »
0
Questa è il file in cui mi creo un thread da richiamare poi come fatto sopra nell'activity principale:

Codice (Java): [Seleziona]
public class TCPClientArticoli implements Runnable {

       
    public void run() {
         try {
                 
                 InetAddress serverAddr = InetAddress.getByName("192.168.0.107");//TCPServer.SERVERIP
                 
                 Log.d("TCP", "C: Connecting to server...");
                 //Socket socket = new Socket(serverAddr, TCPDesktopServer.SERVERPORT);
                 Socket socket = new Socket(serverAddr, 4444);
                 
                 
                 String message = "INVIAMI IL FILE ARTICOLI.XML";
                 
                 
                     try {
                         
                         Log.d("TCP", "CLIENT: Sending: '" + message + "'");
                         PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
                         out.println(message);
                       
                     
                     System.out.println("Ricezione file in corso articoli.xml..");
                     DataInputStream inArt = new DataInputStream(socket.getInputStream());
                     File sdcardDirArt = Environment.getExternalStorageDirectory();
                         File myFileArt = new File(sdcardDirArt,"articoli.xml");
                     FileOutputStream outArt = new FileOutputStream(myFileArt);
                     byte bufferArt[] = new byte[1024];
                     int iArt;
                     while ((iArt = inArt.read(bufferArt,0,bufferArt.length)) != -1){
                     System.out.println("ci sono");
                     outArt.write(bufferArt,0,iArt);
                     }
                     outArt.flush();
                     outArt.close();
                     System.out.println( "Ricezione completata!" );

                     Log.d("TCP", "C: Sent.");
                     Log.d("TCP", "C: Done. DATI INVIATI!");
                     
                     
                     
                     
             } catch(Exception e) {
                 Log.e("TCP", "S: Error", e);
                      } finally {
                        socket.close();
                     
                      }
         } catch (Exception e) {
              Log.e("TCP", "C: Error", e);
         }
         
         
    }//chiusura metodo run
   

   
   
}//chiusura public class TCPClient implements Runnable

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Problema con gestione tra due thread e l'activity principale
« Risposta #2 il: 27 Novembre 2010, 12:59:59 CET »
0
diciamo che sono un'idiota...
basta fare:
Codice (Java): [Seleziona]
//!!!!!!!!!!!!THREAD COMUNICAZIONE CON IL SERVER!!!!!!!!!!!
                Thread cThread = new Thread(new TCPClientArticoli());
                cThread.run();
                cThread.stop();
               
                Thread cThread2 = new Thread(new TCPClientLogSpesa());
                cThread2.run();
                cThread2.stop();      

anche perchè ho definito il metodo run...e non il metodo start che andava lo stesso sulla sdk ma con il cell mi dava problemi quando venive invocato...
ed il problema pare essere stato risolto......

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema con gestione tra due thread e l'activity principale
« Risposta #3 il: 27 Novembre 2010, 21:34:43 CET »
0
non mi pare la soluzione migliore...
perchè non guardi questo tutorial? [facile] Aggiornare ListView popolata da un cursor + download e parsing JSON - Android Developers Italia
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia