2011-12-29 35 views
22

Tôi tạo một chủ đề để cập nhật dữ liệu của mình và thử làm notifyDataSetChanged tại ListView của tôi.Cách sử dụng notifyDataSetChanged() trong chủ đề

private class ReceiverThread extends Thread { 

@Override 
public void run() { 
    //up-to-date 
    mAdapter.notifyDataSetChanged(); 
} 

Lỗi này xảy ra tại dòng:

mAdapter.notifyDataSetChanged(); 

Lỗi:

12-29 16: 44: 39,946: E/AndroidRuntime (9026): android.view. ViewRoot $ CalledFromWrongThreadException: Chỉ chuỗi ban đầu đã tạo phân cấp chế độ xem mới có thể chạm vào chế độ xem của nó.

Tôi nên sửa đổi nó như thế nào?

Trả lời

41

Sử dụng runOnUiThread() phương pháp để thực hiện thao tác giao diện người dùng từ một sợi Non-UI.

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

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

Cảm ơn bạn ... Nó hoàn toàn phù hợp với tôi –

+0

Cảm ơn. Rất tốt ... –

4

Bạn không thể truy cập chuỗi giao diện người dùng từ chuỗi khác.Bạn phải sử dụng trình xử lý để thực hiện điều này.Bạn có thể gửi tin nhắn đến trình xử lý bên trong phương thức chạy và cập nhật giao diện người dùng (gọi mAdapter.notifyDataSetChanged()) trong trình xử lý.

5

Bạn không thể chạm vào giao diện của giao diện người dùng từ chuỗi khác. Đối với sự cố của bạn, bạn có thể sử dụng trình xử lý AsyncTask, runOnUiThread hoặc handler.

Tất cả The Best

1

access the UI thread from other threads

Activity.runOnUiThread (Runnable)

View.post (Runnable)

View.postDelayed (Runnable, dài)

cách tiếp cận của tôi tôi sử dụng các Chủ đề khác cho công việc:

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() phương pháp móc để đối tượng lớp DataSetObservable của AbsListView mà được thiết lập đầu tiên bởi sự tham gia của phương pháp AbsListView.setAdaptert (Adaptor) bằng cách thiết lập callback để Adapter.registerDataSetObserver (DataSetObserver);

Các vấn đề liên quan