Saltar al contenido

RxJava Single.just() vs Single.fromCallable()?

Este tutorial fue evaluado por especialistas para que tengas la garantía de la veracidad de esta reseña.

Solución:

Por lo general, notará la diferencia cuando lo que está emitiendo no es solo un objeto, sino el resultado de algunas llamadas a métodos que involucran cálculos pesados, E/S o estado.

Single.just(x) evalúa el x inmediatamente en el hilo actual y luego te quedas con lo que fue el resultado de xpara todos los suscriptores.

Single.fromCallable(y) invoca el y invocable en el subscribeOn programador en el momento de la suscripción y por separado para cada suscriptor.


Entonces, por ejemplo, si quisiera descargar una operación de E/S a un subproceso en segundo plano, usaría

Single.fromCallable(() -> someIoOperation()).
    subscribeOn(Schedulers.io()).
    observeOn(AndroidSchedulers.mainThread()).
    subscribe(value -> updateUi(value), error -> handleError(error));

Tener Single.just() aquí no funcionaría desde someIoOperation() se ejecutaría en el subproceso actual.

En el caso de uso que ha mencionado, en realidad no hay una gran diferencia.

Ahora imagine que necesitamos que el objeto se cree dinámicamente a través de una llamada de función.

fun getTimeObject() 
    val timeInMillis = System.currentTimeMillis()
    return TimeObject(timeInMillis)

Entonces con, Single.just(getTimeObject()) la resultante Single emitirá lo mismo Long cuando tiene un nuevo suscriptor.

Sin embargo, con Single.fromcallable(()-> getTimeObject())la resultante Single emitirá una diferente Long indicando la hora actual en milis cuando tiene un nuevo suscriptor.

Eso es porque fromCallable ejecuta su lambda cada vez que tiene un nuevo suscriptor Perezosamente.

Deberías usar desde invocable () cuando tienes una función como

MyObject myFunction() 
    // some login here
    return new MyObject();

Entonces puedes crear Único de esta función así:

Single.fromCallable(() -> myFunction());

Single.just(miObjeto) simplemente emite su objeto sin ninguna lógica.

Así que no hay necesidad de usar desde invocable () cuando desee emitir un elemento específico.

Te mostramos reseñas y calificaciones

Recuerda recomendar esta división si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *