如何在线程中使用notifyDataSetChanged()
我创建一个线程来更新我的数据,并尝试在我的ListView上执行notifyDataSetChanged
。如何在线程中使用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:只有创建视图层次结构的原始线程才能触及其视图。
我应该如何修改它?
使用runOnUiThread()
方法来执行从非UI线程的UI动作。
private class ReceiverThread extends Thread {
@Override
public void run() {
Activity_name.this.runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
}
});
}
您无法从其他线程访问UI线程。您必须使用处理程序来执行此操作。您可以将消息发送到您的运行方法中的处理程序并更新UI(调用mAdapter.notifyDataSetChanged())内部处理程序。
您无法触及其他线程的UI视图。对于您的问题,您可以使用AsyncTask,runOnUiThread或处理程序。
万事如意
access the UI thread from other threads
Activity.runOnUiThread(Runnable接口)
View.post(Runnable接口)
View.postDelayed(Runnable接口,长)
我的方法当我使用其他线程工作:
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();
}
}
});
}
}
顺便说一句notifyDatasetChanged()方法钩AbsListView的DataSetObservable类对象是由通过设置回调Adapter.registerDataSetObserver(DataSetObserver)涉及AbsListView.setAdaptert(适配器)方法首先设置;
谢谢......它完全适用于我 – 2014-05-28 10:08:45
Thanks.Very good ... – 2014-07-20 10:09:22