2016-01-27 16 views
6

Il mio codice è simile a questo:Rxjava AndroidSchedulers.mainThread() significa thread UI?

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

ma ho ottenuto un errore: Solo il thread originale che ha creato una gerarchia vista può toccare i suoi panorami. così ho modificarla in:

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

Rende sense.So Sono confuso. Avevo pensato che lo .observeOn(AndroidSchedulers.mainThread()) significasse che il codice nel blocco subscribe viene eseguito sul thread ui, ma come ho ottenuto questo errore?

+0

Lo stacktrace punta a 'adapter.notifyDataSetChanged()'? Mb l'errore è in un'altra parte della catena? In generale, sì, 'mainThread()' significa thread dell'interfaccia utente di Android. – AndroidEx

+0

non so come capire se lo stacktrace punta a adapter.notifyDataSetChanged –

risposta

6

Il problema è con il codice qui:

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

Non è possibile iscriversi sul thread UI come avete notato, si otterrà un'eccezione:

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

Che cosa si dovrebbe fare è per iscriversi sul thread I/O e osservare sul thread dell'interfaccia utente:

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

Grazie. Perché Observable non può iscriversi sul thread dell'interfaccia utente? –

Problemi correlati