Autore Topic: Aggiornare listview dopo aver lanciato un timer  (Letto 769 volte)

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Aggiornare listview dopo aver lanciato un timer
« il: 31 Gennaio 2011, 18:50:24 CET »
0
Buongiorno ragazzi.
Io ho una listview popolata con degli elementi presi da un db. A tale listview passo un'adapter a cui passo un cursor con associata una query.
I dati per popolare la listview mi arrivano da un server sotto forma di file xml di cui poi io faccio il parsing.
All'apertura del programma faccio partire un timer in cui se viene trovata la rete "home" avviene la sincronizzazione (lancio dei thread in cui ricevo dei file xml).
Una volta ricevuti dopo aver fatto il parsing e fatto l'update del database [ UpdateData() ] vorrei passare tali dati alla listview con il solito modo come detto sopra, ma ho un errore e l'applicazione crasha.

Il codice è il seguente:
Codice (Java): [Seleziona]
 wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
            //Se la wi-fi è disabilitata la attivo prima del timer
            if(wm.getWifiState()==1)
                wm.setWifiEnabled(true);
           
            Context context2 = getApplicationContext();
                CharSequence text2 = "TENTATIVO DI SINCRONIZZAZIONE CON IL SERVER IN CORSO...";
            int duration2 = Toast.LENGTH_LONG;
            Toast toast2 = Toast.makeText(context2, text2, duration2);
            toast2.show();
       
         int startUp = 20000;     // millisecondi di attesa per fare partire il timer
     int periodo = 50000;     // millisecondi di attesa per la ripetizione del timer
     Timer timer = new Timer();      //timer
     //il metodo run viene eseguito ad ogni scadenza del timer
     timer.scheduleAtFixedRate(
             new TimerTask() {
                     int count=0;
                   
                     public void run() {

                                wm.startScan();
                                        List<ScanResult> list = wm.getScanResults();
                               
                                        for(int i=0;i<list.size();i++)
                                                {
                                                        Log.i("SSID: ", String.valueOf(list.get(i).SSID)+"\n");
                                                        Log.i("BSSID: ", String.valueOf(list.get(i).BSSID));
                                                        Log.i("LEVEL: ", String.valueOf(list.get(i).level+"\n"));
                                                        Log.i("FREQUENCY: ", String.valueOf(list.get(i).frequency)+"\n");
                                                        Log.i("DESCRIBE CONTENTS: ", String.valueOf(list.get(i).describeContents())+"\n");
                                                        Log.i("CAPABILITIES: ", String.valueOf(list.get(i).capabilities)+"\n");
                                                        count++;
                                       
                                                        if(String.valueOf(list.get(i).SSID).equals(agenda.bean.Stringhe.NAME_WI_FI_NETWORK)){
               
                                        //Qua lanciamo i thread di sincronizzazione dopo aver messeo in wait il
                                        //timer per dare il tempo alla wi-fi di connettersi alla rete home trovata

                                                                Thread cThread = new Thread(new TCPClientArticoli());                                                  
                                                                cThread.run();                                                 
                                                                cThread.stop();
                                                       
                                                                Thread cThread2 = new Thread(new TCPClientLogSpesa());
                                                                cThread2.run();
                                                                cThread2.stop();    
                                                               
                                                                Thread cThread3 = new Thread(new TCPClientBarcode());
                                                                cThread3.run();
                                                                cThread3.stop();  
                                                       
                                                                Looper.myLooper();
                                                                                Looper.prepare();
                                                               
                                                                ///////////////////////
                                                                        UpdateData();
                                                                        db2.open();    
                                                                        ListView productsLv=(ListView)findViewById(R.id.productsLv);
                                                                        adaptatore.notifyDataSetChanged();
                                                                        productsLv.setAdapter(adaptatore);
                                                                        db2.close();
                                                                        ///////////////////////////////
                                                                       
                                                                this.cancel();
                                                                wm.setWifiEnabled(false);                                      
                                                        }//chiusura if SSID=Sitecom
                                                }//Chiusura for scan result
                     }//Chiusura run()      
                     
               
             },
             startUp, periodo
     );

e nel logcat ho questo errore che non riesco a comprendere:
01-31 18:44:34.675: WARN/dalvikvm(4992): threadid=7: thread exiting with uncaught exception (group=0x400259f8)
01-31 18:44:34.686: ERROR/AndroidRuntime(4992): FATAL EXCEPTION: Timer-0
01-31 18:44:34.686: ERROR/AndroidRuntime(4992): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
01-31 18:44:34.686: ERROR/AndroidRuntime(4992):     at android.view.ViewRoot.checkThread(ViewRoot.java:2824)
01-31 18:44:34.686: ERROR/AndroidRuntime(4992):     at android.view.ViewRoot.requestLayout(ViewRoot.java:598)
01-31 18:44:34.686: ERROR/AndroidRuntime(4992):     at android.view.View.requestLayout(View.java:8126)
01-31 18:44:34.686: ERROR/AndroidRuntime(4992):     at android.view.View.requestLayout(View.java:8126)
01-31 18:44:34.686: ERROR/AndroidRuntime(4992):     at android.view.View.requestLayout(View.java:8126)
01-31 18:44:34.686: ERROR/AndroidRuntime(4992):     at android.view.View.requestLayout(View.java:8126)
01-31 18:44:34.686: ERROR/AndroidRuntime(4992):     at android.view.View.requestLayout(View.java:8126)
01-31 18:44:34.686: ERROR/AndroidRuntime(4992):     at android.widget.AbsListView.requestLayout(AbsListView.java:993)
01-31 18:44:34.686: ERROR/AndroidRuntime(4992):     at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:790)
01-31 18:44:34.686: ERROR/AndroidRuntime(4992):     at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:31)
01-31 18:44:34.686: ERROR/AndroidRuntime(4992):     at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
01-31 18:44:34.686: ERROR/AndroidRuntime(4992):     at ch.egsolutions.databasetutorial.Demo$4.run(Demo.java:170)
01-31 18:44:34.686: ERROR/AndroidRuntime(4992):     at java.util.Timer$TimerImpl.run(Timer.java:289)
01-31 18:44:34.686: WARN/ActivityManager(96):   Force finishing activity ch.egsolutions.databasetutorial/.Demo

Vi ringrazio per l'aiuto.
Ciao.

Offline dessorry

  • Utente normale
  • ***
  • Post: 230
  • Who lived hoping died craping
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Play Store ID:
    dessorry
  • Sistema operativo:
    Windows, Ubuntu, Kubuntu
Re:Aggiornare listview dopo aver lanciato un timer
« Risposta #1 il: 02 Febbraio 2011, 01:43:03 CET »
0
posta il codice della riga 289 di Timer.java e della riga 170 di Demo.java

nel logcat indica precisamente il punto di non ritorno
indaghiamo su quella riga direttamente (non ho letto il codice che hai postato)