2011-12-29 114 views
22

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

我应该如何修改它?

回答

41

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

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

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

谢谢......它完全适用于我 – 2014-05-28 10:08:45

+0

Thanks.Very good ... – 2014-07-20 10:09:22

4

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

5

您无法触及其他线程的UI视图。对于您的问题,您可以使用AsyncTask,runOnUiThread处理程序

万事如意

1

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(适配器)方法首先设置;