如何在线程中使用notifyDataSetChanged()

我创build一个线程来更新我的数据,并尝试在我的ListView做notifyDataSetChanged

 private class ReceiverThread extends Thread { @Override public void run() { //up-to-date mAdapter.notifyDataSetChanged(); } 

错误发生在行:

 mAdapter.notifyDataSetChanged(); 

错误

12-29 16:44:39.946:E / AndroidRuntime(9026):android.view.ViewRoot $ CalledFromWrongThreadException:只有创build视图层次结构的原始线程可以触及其视图。

我应该如何修改它?

Solutions Collecting From Web of "如何在线程中使用notifyDataSetChanged()"

使用runOnUiThread()方法从非UI线程执行UI操作。

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

您无法触及其他线程的用户界面视图。 对于您的问题,您可以使用AsyncTaskrunOnUiThread处理程序

祝一切顺利

您不能从其他线程访问UI线程。您必须使用处理程序执行此操作。您可以将消息发送到您的运行方法中的处理程序并更新UI(调用mAdapter.notifyDataSetChanged())内部处理程序。

从其他线程访问UI线程

Activity.runOnUiThread(可运行)

View.post(可运行)

View.postDelayed(Runnable,long)

我的方法,当我使用其他线程的工作:

 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()方法挂钩到AbsListView的DataSetObservable类对象,它首先通过设置callback到Adapter.registerDataSetObserver(DataSetObserver)来涉及到AbsListView.setAdaptert(Adapter)方法来设置;