web-dev-qa-db-fra.com

Comment utiliser notifierdatastetchangeed () dans le fil

Je crée un thread pour mettre à jour mes données et essayer de faire notifyDataSetChanged à ma liste de liste.

private class ReceiverThread extends Thread {

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

L'erreur se produit en ligne:

mAdapter.notifyDataSetChanged();

erreur:

12-29 16: 44: 39.946: E/Androiïruntime (9026): Android.View.Viewroot $ appeléfromwrongthreadException: Seul le fil d'origine créé une hiérarchie de vue peut toucher ses vues.

Comment dois-je le modifier?

27
brian

Utilisez runOnUiThread() Méthode pour exécuter l'action d'interface utilisateur d'un fil non-UI.

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

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

Vous ne pouvez pas toucher les vues de l'interface utilisateur à partir d'un autre fil. Pour votre problème, vous pouvez utiliser asyncktask, runonuthread ou gestionnaire.

Tous mes vœux

6
Richa

Vous ne pouvez pas accéder au fil d'interface utilisateur à partir d'un autre thread.Vous devez utiliser le gestionnaire pour effectuer cela.Vous pouvez envoyer un message au gestionnaire à l'intérieur de votre méthode d'exécution et mettre à jour l'interface utilisateur (appel Madapter.notifyDataSetSetSetched ()).

4
Ramindu Weeraman

Accédez au fil de l'interface utilisateur d'autres threads

Activité.RunonUthread (Runnable)

View.post (Runnable)

View.PostDelayed (Runnable, Long)

mon approche que j'utilise d'autres threads pour le travail:

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 notifyDatasetchangeed () Crochets de la méthode de la classe d'AbslusView Abslusview qui est défini en premier impliquant Abslistview.sedaDaptert (adaptateur) en définissant le rappel sur Adapter.registerdataSetObserver (DataSetobserver);

1
ceph3us

Vous pouvez écrire de cette manière aussi.

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

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

juste tester cela.

0
Gyan Swaroop Awasthi