Comment utiliser notifyDataSetChanged() dans thread

je crée un thread pour mettre à jour mes données et j'essaie de faire notifyDataSetChanged à ma ListView.

private class ReceiverThread extends Thread {

@Override
public void run() { 
    //up-to-date
    mAdapter.notifyDataSetChanged();
}

L'erreur se produit à la ligne:

mAdapter.notifyDataSetChanged();

Erreur:

12-29 16:44:39.946: e / AndroidRuntime(9026): android.vue.ViewRoot$CalledFromWrongThreadException: seul le thread original qui a créé une hiérarchie de vues peut toucher ses vues.

Comment dois-je le modifier?

25
demandé sur Mario Kutlev 2011-12-29 12:50:52

4 réponses

Utiliser runOnUiThread() méthode pour exécuter L'action de L'UI à partir d'un thread non-UI.

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

        @Override
        public void run() {
             mAdapter.notifyDataSetChanged();
        }
    });
}
43
répondu Lalit Poptani 2011-12-29 09:16:23

vous ne pouvez pas toucher les vues de L'interface utilisateur à partir d'un autre fil. Pour votre problème, vous pouvez utiliser AsyncTask, runOnUiThread ou gestionnaire.

Tous Les Meilleurs

6
répondu Richa 2014-04-03 08:33:06

vous ne pouvez pas accéder au fil UI à partir d'un autre fil.Vous devez utiliser le gestionnaire pour effectuer cette.Vous pouvez envoyer un message à handler à l'intérieur de votre méthode d'exécution et mettre à jour L'UI (appeler mAdapter.notifyDataSetChanged()) à l'intérieur de gestionnaire.

4
répondu Ramindu Weeraman 2011-12-29 08:55:14

accédez au thread de L'interface utilisateur à partir d'autres threads

Activité.runOnUiThread (Runnable)

vue.de poste(Runnable)

vue.postDelayed (Runnable, long)

mon approche quand j'utilise d'autres Threads pour travailler:

private AbsListView _boundedView;
private BasicAdapter _syncAdapter;

 /** bind view to adapter */
public void bindViewToSearchAdapter(AbsListView view) {
    _boundedView = view;
    _boundedView.setAdapter(_syncAdapter);
}

/** update view on UI Thread */
public void updateBoundedView() {
    if(_boundedView!=null) {
        _boundedView.post(new Runnable() {
            @Override
            public void run() {
                if (_syncAdapter != null) {
                    _syncAdapter.notifyDataSetChanged();
                }
            }
        });
    }
}

btw notifyDatasetChanged () la méthode s'accroche à L'objet de classe observable DataSetObservable D'AbsListView qui est défini en premier par L'utilisation d'AbsListView.setAdaptert (Adaptateur) méthode en réglant le rappel à L'Adaptateur.registerDataSetObserver (DataSetObserver);

1
répondu ceph3us 2015-07-02 00:08:46