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?
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();
}
});
}
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
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 ()).
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);
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.