1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Aktualisierung ListView aus Thread

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von schnti, 02.08.2012.

  1. schnti, 02.08.2012 #1
    schnti

    schnti Threadstarter Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    02.08.2012
    Hallo zusammen,

    ich suche verzweifelt die Möglichkeit eine ListView aus einem Thread heraus zu aktualisieren.

    Ich habe folgenden Code:
    Code:
    import java.util.ArrayList;
    import java.util.List;
    
    import android.annotation.TargetApi;
    import android.app.ListActivity;
    import android.content.Context;
    import android.net.wifi.ScanResult;
    import android.net.wifi.WifiManager;
    import android.os.Bundle;
    import android.view.Menu;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.Toast;
    
    public class MainActivity extends ListActivity {
        WifiManager wifiManager;
    
        private ArrayList<String> wlanArrayList = new ArrayList<String>();;
        public ArrayAdapter<String> wlanArrayAdapter;
    
        Button scanButton;
        Thread searchThread;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            wlanArrayAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, wlanArrayList);
            setListAdapter(wlanArrayAdapter);
    
            suchen();
    
        }
    
        public void suchen() {
    
            wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    
            Runnable updateThread = new Runnable() {
                @TargetApi(14)
                public void run() {
                    while (true) {
                        if (wifiManager.isWifiEnabled() == false) {
                            wifiManager.setWifiEnabled(true);
                        }
    
                        wlanArrayList.clear();
                        wifiManager.startScan();
    
                        List<ScanResult> WLANs = wifiManager.getScanResults();
    
                        try {
                            for (ScanResult WLAN : WLANs) {
                                wlanArrayList.add(WLAN.SSID + " | "
                                        + WLAN.frequency + " | " + WLAN.level);
                            }
    
                            wlanArrayAdapter.notifyDataSetChanged();
    
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
    
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
    
            Thread thread = new Thread(updateThread);
            thread.start();
    
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    }
    
    Der Code funktioniert soweit, jedoch wird der ListView nur aktualisiert, wenn ich scrolle....

    Kann mir jemand weitelfen?
    Vielen Dank
     
  2. swordi, 02.08.2012 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    du kannst keine UI Operationen in einem Thread machen.

    das musst du im UI thread erledigen
     
    schnti bedankt sich.
  3. schnti, 10.08.2012 #3
    schnti

    schnti Threadstarter Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    02.08.2012
    vielen Dank, das hat mir sehr weitergeholfen.

    Meine Lösung:

    Um den Aufruf:
    Code:
    wlanArrayAdapter.notifyDataSetChanged();
    Folgenden Thread starten:
    Code:
    MainActivity.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
           wlanArrayAdapter.notifyDataSetChanged();
         }
    });
    
    Ist diese Lösung so sinnvoll? Da ich ja nun wieder einen neuen Thread starte?

    Vielen Dank.
     
  4. swordi, 10.08.2012 #4
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    du startest keinen neuen thread. du nutzt nur den vorhandenen ui thread
     

Diese Seite empfehlen