29 Stimmen

Wie man notifyDataSetChanged() im Thread benutzt

Ich erstelle einen Thread, um meine Daten zu aktualisieren und versuche notifyDataSetChanged bei meinem ListView auszuführen.

private class EmpfängerThread extends Thread {

@Override
public void run() { 
    //aktualisieren
    mAdapter.notifyDataSetChanged();
}

Der Fehler tritt in der Zeile auf:

mAdapter.notifyDataSetChanged();

Fehler:

12-29 16:44:39.946: E/AndroidRuntime(9026): android.view.ViewRoot$CalledFromWrongThreadException: Nur der Ursprungsthread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren.

Wie soll ich es ändern?

49voto

Lalit Poptani Punkte 66548

Verwenden Sie die Methode runOnUiThread(), um die UI-Aktion von einem Nicht-UI-Thread auszuführen.

private class ReceiverThread extends Thread {
@Override
public void run() { 
Activity_name.this.runOnUiThread(new Runnable() {

        @Override
        public void run() {
             mAdapter.notifyDataSetChanged();
        }
    });
}

9voto

Richa Punkte 3157

Du kannst die Ansichten der Benutzeroberfläche nicht von einem anderen Thread aus berühren. Für dein Problem kannst du entweder AsyncTask, runOnUiThread oder handler verwenden.

Alles Gute

4voto

Ramindu Weeraman Punkte 344

Sie können nicht auf den UI-Thread von einem anderen Thread aus zugreifen. Sie müssen einen Handler verwenden, um dies durchzuführen. Sie können innerhalb Ihrer run-Methode eine Nachricht an den Handler senden und die Oberfläche aktualisieren (mAdapter.notifyDataSetChanged()) innerhalb des Handlers aufrufen.

1voto

ceph3us Punkte 7061

auf den UI-Thread von anderen Threads zugreifen

Activity.runOnUiThread(Runnable)

View.post(Runnable)

View.postDelayed(Runnable, long)

mein Ansatz, wenn ich andere Threads für die Arbeit benutze:

private AbsListView _boundedView;
private BasicAdapter _syncAdapter;

 /** Ansicht an Adapter binden */
public void bindViewToSearchAdapter(AbsListView view) {
    _boundedView = view;
    _boundedView.setAdapter(_syncAdapter);
}

/** Ansicht auf dem UI-Thread aktualisieren */
public void updateBoundedView() {
    if(_boundedView!=null) {
        _boundedView.post(new Runnable() {
            @Override
            public void run() {
                if (_syncAdapter != null) {
                    _syncAdapter.notifyDataSetChanged();
                }
            }
        });
    }
}

übrigens, die Methode notifyDatasetChanged() hängt an dem DataSetObservable-Klassenobjekt von AbsListView, das zuerst durch Einbeziehen der Methode AbsListView.setAdapter(Adapter) festgelegt wird, indem der Rückruf auf Adapter.registerDataSetObserver(DataSetObserver) gesetzt wird;

0voto

Sie können auch auf diese Weise schreiben.

  new Handler().postDelayed(new Runnable() {
                public void run() {
                    test();
                }
            }, 100);

private void test() {
    this.notifyDataSetChanged();
}

Einfach mal testen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X