2016-01-27 7 views
6

Mój kod to tak:Rxjava AndroidSchedulers.mainThread() oznacza wątek UI?

.observeOn(AndroidSchedulers.mainThread()) 
.subscribeOn(AndroidSchedulers.mainThread()) 
.subscribe ({ 
    adapter.notifyDataSetChanged() 
}) 

ale mam błąd: tylko oryginalny wątek, który stworzył hierarchię widok może dotknąć jego poglądy. więc go zmienić na:

.observeOn(AndroidSchedulers.mainThread()) 
.subscribeOn(AndroidSchedulers.mainThread()) 
.subscribe ({ 
     runOnUiThread(Runnable { 
      adapter.notifyDataSetChanged() 
}) 
} 

To sprawia sense.So Jestem zdezorientowany. Myślałem, że .observeOn(AndroidSchedulers.mainThread()) oznacza, że ​​kod w bloku subskrypcji działa na wątku interfejsu użytkownika, ale jak mam ten błąd?

+0

Czy wskaźnik stacktrace wskazuje na "adapter.notifyDataSetChanged()"? Mb błąd jest w innej części łańcucha? Ogólnie rzecz biorąc, tak, "mainThread()" oznacza wątek interfejsu użytkownika Androida. – AndroidEx

+0

Nie wiem, jak ustalić, czy stacktrace wskazuje na adapter.notifyDataSetChanged –

Odpowiedz

6

Problemem jest to, ze kod tutaj:

.observeOn(AndroidSchedulers.mainThread()) 
.subscribeOn(AndroidSchedulers.mainThread()) 

nie można zapisać się na wątku UI, jak zauważył, dostaniesz wyjątek:

Only the original thread that created a view hierarchy can touch its views.

Co należy zrobić, to aby zasubskrybować wątek we/wy i obserwować w wątku UI:

.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe() 
+0

Dziękuję. Dlaczego Obserwowalny nie może zasubskrybować wątku interfejsu użytkownika? –