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