如何在线程中使用notifyDataSetChanged()

时间:2011-12-29 08:50:53

标签: android listview android-listview

我创建了一个线程来更新我的数据并尝试在我的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:只有创建视图层次结构的原始线程才能触及其视图。

我应该如何修改它?

5 个答案:

答案 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();
}

只是测试一下。