Search code examples
androidkotlinrx-java2android-architecture-componentsandroid-livedata

Converting RxJava code to a new code using architecture components on Android


Using RxJava on Kotlin Android, what am I doing is -

I have a function to create a Bitmap which I'm running in an IO thread.

After the Bitmap is ready, I'm setting it to an ImageView on the main thread.

var observable : Observable<Bitmap> = Observable.just(makeBitmap(path))

var observer:Observer<Bitmap> = io.reactivex.Observer<Bitmap>() {
                fun onSubscribe(d: Disposable) {
                    disposable = d
                }
                fun onNext(bitmap) {
                   imageView.setImageBitmap(bitmap)
                }
                fun onError(e:Throwable) {
                }
                fun onComplete() {
                }
            }

observable.subscribeOn(Schedulers.io())
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(observer)

My question is, can we achieve something like this using LiveData and by Observing the data in architecture components ?

Basically I want to observe something on main thread but the heavy work has to be done on a separate thread.


Solution

  • Well, you could have something like this:

    var bitmapLiveData: MutableLiveData<Bitmap> = MutableLiveData()
    
    fun createBitmap(): LiveData<Bitmap> {
    
            var observable : Observable<Bitmap> = Observable.just(makeBitmap(path))
            val result = observable.subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe({
                        result ->
                        bitmapLiveData.postValue(result)
                    },{
                        error->
                        error.printStackTrace()
                    },{
                        //completed
                    })
    
            return bitmapLiveData
    
        }
    

    I put that in a view model that can be observed by a LifecycleOwner:

     viewModel.createBitmap().observe(this, Observer { 
                it?.let { 
                    //result bitmap
                }
            })