我创建了一个线程来更新我的数据并尝试在我的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:只有创建视图层次结构的原始线程才能触及其视图。
我应该如何修改它?
答案 0 :(得分:45)
使用runOnUiThread()
方法从非UI线程执行UI操作。
private class ReceiverThread extends Thread {
@Override
public void run() {
Activity_name.this.runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
}
});
}
答案 1 :(得分:6)
您无法从其他线程触摸UI的视图。对于您的问题,您可以使用 AsyncTask , runOnUiThread 或处理程序。
所有最好的
答案 2 :(得分:4)
您无法从其他线程访问UI线程。您必须使用处理程序来执行此操作。您可以在run方法中向处理程序发送消息并在处理程序内更新UI(调用mAdapter.notifyDataSetChanged())。
答案 3 :(得分:1)
access the UI thread from other threads
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类对象,该对象首先通过将回调设置为Adapter.registerDataSetObserver(DataSetObserver)来涉及AbsListView.setAdaptert(Adapter)方法。
答案 4 :(得分:0)
您也可以用这种方式写。
new Handler().postDelayed(new Runnable() {
public void run() {
test();
}
}, 100);
private void test() {
this.notifyDataSetChanged();
}
只是测试一下。