如何在线程中使用notifyDataSetChanged()

29

我创建了一个线程来更新我的数据,并尝试在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个回答

49

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

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

        @Override
        public void run() {
             mAdapter.notifyDataSetChanged();
        }
    });
}

9

您不能从其他线程触摸UI视图。针对您的问题,您可以使用AsyncTaskrunOnUiThreadhandler

祝一切顺利!


4

您无法从其他线程访问UI线程。您必须使用处理程序来执行此操作。您可以在run方法中向处理程序发送消息并在处理程序内更新UI(调用mAdapter.notifyDataSetChanged())。


1

从其他线程访问UI线程

Activity.runOnUiThread(Runnable)

View.post(Runnable)

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

顺便说一下,notifyDatasetChanged() 方法钩子到 AbsListView 的 DataSetObservable 类对象上,该对象首先通过调用 AbsListView.setAdaptert(Adapter) 方法来设置回调 Adapter.registerDataSetObserver(DataSetObserver);


0

你也可以这样写。

  new Handler().postDelayed(new Runnable() {
                public void run() {
                    test();
                }
            }, 100);

private void test() {
    this.notifyDataSetChanged();
}

只是测试一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接