Aktualisierung ListView aus Thread

S

schnti

Neues Mitglied
0
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
 
du kannst keine UI Operationen in einem Thread machen.

das musst du im UI thread erledigen
 
  • Danke
Reaktionen: schnti
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.
 
du startest keinen neuen thread. du nutzt nur den vorhandenen ui thread
 

Ähnliche Themen

A
Antworten
10
Aufrufe
1.017
swa00
swa00
R
  • Robby1950
2
Antworten
23
Aufrufe
1.005
Robby1950
R
B
Antworten
6
Aufrufe
1.049
jogimuc
J
Zurück
Oben Unten