¿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?
- convertir a lambda de rx java expresión
- RxJava como un bus de eventos, onNext se llama varias veces cuando sólo un mensaje de evento
- .debounce () de RxJava interfiriendo con los hilos de mis observables y manejo de errores
- Utilizar la programación con RxAndroid
- Excepción de interrupción de subproceso en modo Multi-ventana
Todas las funciones de este objeto deben ejecutarse en un subproceso de fondo. Obtener, poner, borrar y eliminar.
String city = Paper.get("city");
- Cómo obtener el patrón NullObject con RxJava
- RxJava No puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()
- Cómo encadenar los métodos groupBy () de RxJava como groupBy (). GroupBy ()
- Cómo hacer que flatMap se ejecute en un subproceso de fondo
- Cómo poner en cola las llamadas de la API cuando no está conectado mientras usa Retrofit
- RXJava - hacer un observable pausable (con buffer y ventana, por ejemplo)
- Repetir la llamada API con retrofit y rxjava
- Cómo utilizar rxandroid para escuchar la actualización de ubicación de gps
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.
- Problemas con el ejemplo de Kontakt.io Beacon
- Intel HAXM / Android Studio en OS X 10.11 / El Capitán