¿Cómo ejecutaría esta sentencia usando RxJava?

Rx manera de hacer las cosas puede ser muy complejo para ninguno y por muchas razones … pero siento que hay formas sencillas de hacer cosas simples con RX …

¿Cómo podría simplemente realizar esta declaración en un hilo de fondo y recibir la respuesta en el hilo ui?

Todas las funciones de este objeto deben ejecutarse en un subproceso de fondo. Obtener, poner, borrar y eliminar.

String city = Paper.get("city"); 

El objeto base en Rx es Observable . Ese objeto normalmente envuelve un objeto OnSubscribe , que es simplemente una extensión de Action1 que toma un Subscriber como parámetro.

Lo que todo lo que significa es que sólo necesita definir una clase que envuelve su llamada y pasa el resultado al Subscriber :

 public class RxPaperGet implements Observable.OnSubscribe<String> { @Override public void call(Subscriber<? super String> t1) { try { t1.onNext(Paper.get("city")); } catch (Throwable t) { t1.onError(t); return; } t1.onCompleted(); } } 

Ese es un ejemplo básico. Ahora, usted querría envolver que para que pueda llamar a cualquier función, y no sólo Paper.get("city") . Algo así como https://github.com/ReactiveX/RxJavaAsyncUtil/blob/0.x/src/main/java/rx/util/async/operators/OperatorFromFunctionals.java#L44 hace eso, al permitirle pasar un arbitrario Callable .

Que en su caso, se implementaría como:

 Observable<String> res = OperatorFromFunctionals.fromCallable(() -> Paper.get("city")); 

(En caso de que usted se está preguntando, este es java8 lambdas traído a android por retrolambda. Bastante agradable para eliminar la verbosidad de Rx)

Una vez que tenga su observable, puede suscribirse a él, y obtener resultados. Para ejecutar en el fondo, y recuperar los resultados en el hilo ui, usted haría:

  res.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) 

AndroidSchedulers es proporcionado por rx-android .

Entonces usted puede simplemente ser llamadoback con el resultado:

 .subscribe(city -> Log.d(TAG, city)); 

Que devuelve una suscripción, que es útil si necesita cancelarla.

En general:

 OperatorFromFunctionals.fromCallable(() -> Paper.get("city")) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(city -> Log.d(TAG, city)); 

EDIT: Esto no es correcto. No eliminará la respuesta sin embargo para conservar los comentarios.

Ejemplo muy sencillo:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getPaper() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String s) { Log.d("xxx", s); } }); } private Observable<String> getPaper() { return Observable.just(Paper.get()); } 

Donde Paper.get() es una operación de ejecución larga que devuelve una String . Compruebe los documentos de Scheduler .

No se olvide de observar en el hilo principal si desea cambiar la interfaz de usuario después de recibir el resultado de su operación, de lo contrario obtendrá una excepción para cambiar la interfaz de usuario desde fuera del hilo de interfaz de usuario.

  • RxJava: Se produjo un error al intentar propagar el error a Observer.onError
  • Prueba de Android Realm con RxJava - "abierto desde un hilo sin un Looper" Excepción
  • CalledFromWrongThreadException incluso cuando se utiliza AndroidSchedulers.mainThread ()
  • ¿Cuándo se debe usar RxJava Observable y cuándo Callback simple en Android?
  • Uso de "skipWhile" combinado con "repeatWhen" en RxJava para implementar el sondeo de servidor
  • RxJava dividir uno Observable a dos subObservables
  • RXJava - ejecuta múltiples observables tras otro (como concat, pero con onCompleted para cada observable)
  • ¿Cómo utilizar Rx para gestionar múltiples observadores con el fin de mantener una sola conexión abierta a un servicio?
  • RxAndroidBle mantener una conexión persistente + Manejo de escritura / notificación
  • MVP de Android con RxAndroid + Retrofit
  • Retorno combinado observable sólo si una condición coincide
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.