2016-01-27 3 views
6

Mein Code ist wie folgt:Rxjava AndroidSchedulers.mainThread() bedeutet UI-Thread?

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

, aber ich habe einen Fehler: nur das Original-Thread, der eine Ansicht Hierarchie erstellt seine Ansichten berühren kann. so ändere ich es:

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

Es macht sense.So Ich bin verwirrt. Ich dachte, die .observeOn(AndroidSchedulers.mainThread()) bedeutet, dass der Code im Subscribe-Block auf ui Thread läuft, aber wie habe ich diesen Fehler bekommen?

+0

Hat der Stacktrace Punkt 'adapter.notifyDataSetChanged()'? Mb ist der Fehler in einem anderen Teil der Kette? Im Allgemeinen bedeutet ja "mainThread()" androids UI-Thread. – AndroidEx

+0

Ich weiß nicht, wie man herausfinden kann, ob Stacktrace auf adapter.notifyDataSetChanged zeigt –

Antwort

6

Das Problem ist, mit dem Code hier:

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

Sie nicht auf dem UI-Thread abonnieren können, wie Sie bemerkt haben, erhalten Sie eine Ausnahme erhalten:

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

Was Sie tun sollten auf I/O-Thread und beobachten auf UI-Thread abonnieren:

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

Vielen Dank. Warum kann Observable den UI-Thread nicht abonnieren? –

Verwandte Themen