首页 > 解决方案 > 使用 Android 上的架构组件将 RxJava 代码转换为新代码

问题描述

在 Kotlin Android 上使用 RxJava,我在做什么是 -

我有一个函数来创建我在 IO 线程中运行的位图。

位图准备好后,我将其设置为主线程上的 ImageView。

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)

我的问题是,我们可以使用 LiveData 并通过观察架构组件中的数据来实现这样的目标吗?

基本上我想在主线程上观察一些东西,但是繁重的工作必须在一个单独的线程上完成。

标签: androidkotlinrx-java2android-architecture-componentsandroid-livedata

解决方案


好吧,你可以有这样的东西:

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

    }

我把它放在一个可以被 LifecycleOwner 观察到的视图模型中:

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

推荐阅读