Преобразование кода RxJava в новый код с использованием компонентов архитектуры на Android - PullRequest
0 голосов
/ 31 мая 2018

Используя RxJava на Kotlin Android, я делаю следующее:

У меня есть функция для создания растрового изображения, которое я запускаю в потоке ввода-вывода.

После того, как растровое изображение готовоЯ устанавливаю его в 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 и наблюдая данные в компонентах архитектуры?

По сути, я хочу наблюдать кое-что в главном потоке, но тяжелая работа должна выполняться в отдельном потоке.

1 Ответ

0 голосов
/ 31 мая 2018

Ну, у вас может быть что-то вроде этого:

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
            }
        })
...