2011-12-29 2 views
22

Tworzę wątek, aby zaktualizować moje dane i spróbować zrobić notifyDataSetChanged w moim ListView.Jak używać notifyDataSetChanged() w wątku

private class ReceiverThread extends Thread { 

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

Błąd występuje na linii:

mAdapter.notifyDataSetChanged(); 

błąd:

12-29 16: 44: 39,946: E/Android Runtime (9026) android.view. ViewRoot $ CalledFromWrongThreadException: Tylko oryginalny wątek, który utworzył hierarchię widoku, może dotykać swoich widoków.

Jak mogę to zmienić?

Odpowiedz

41

Zastosowanie runOnUiThread() sposób wykonać akcję UI z wątku Non-UI.

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

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

Dziękuję ... Doskonale dla mnie działa –

+0

Dzięki. Bardzo dobrze ... –

4

Nie można uzyskać dostępu do wątku interfejsu użytkownika z innego wątku. Aby to wykonać, należy użyć programu obsługi. Można wysłać wiadomość do programu obsługi w ramach metody uruchamiania i zaktualizować interfejs użytkownika (wywołanie mAdapter.notifyDataSetChanged()) wewnątrz procedury obsługi.

5

Nie można dotykać widoków interfejsu użytkownika z innego wątku. Aby rozwiązać ten problem, można użyć klienta: AsyncTask, runOnUiThread lub handler.

All The Best

1

access the UI thread from other threads

Activity.runOnUiThread (Runnable)

View.post (Runnable)

View.postDelayed (Runnable, długo)

moje podejście gdy używam innych wątków do pracy:

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

okazji notifyDatasetChanged() metoda haków DataSetObservable klasa obiektu AbsListView ustawianego najpierw obejmujący sposób AbsListView.setAdaptert (adaptera), ustawiając zwrotnego do Adapter.registerDataSetObserver (DataSetObserver);