RxAndroid:对Schedulers.io用户界面的变化()线程 [英] RxAndroid: UI changes on Schedulers.io() thread

查看:914
本文介绍了RxAndroid:对Schedulers.io用户界面的变化()线程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这正在改变主屏幕墙纸IO线程简单的工作,在那之后我试图运行在UI线程一些动画:

I have simple job on IO thread which is changing home screen wallpaper, after that I'm trying to run some animation on UI thread:

     AppObservable.bindFragment(this, Observable.just(0))
       .observeOn(Schedulers.io())
       .subscribe(v -> setWallpaperOnSeparateThread());

private void setWallpaperOnSeparateThread() {
     WallpaperHelper.setBitmapAsWallpaper(photoViewAttacher.getVisibleRectangleBitmap(), getBaseActivity());

     AppObservable.bindFragment(this, Observable.just(0))
       .delay(500, TimeUnit.MILLISECONDS)
       .observeOn(AndroidSchedulers.mainThread())
       .subscribe(integer -> loadFinishAnimationAfterSetWallpaper());
}

但是这种方法会导致错误:
java.lang.IllegalStateException:观察员必须从主UI线程认购,但螺纹[RxCachedThreadScheduler-1,5,主]

我试图改变第二观测到:

I've tried to change second Observable to:

  AppObservable.bindFragment(this, Observable.just(0))
    .delay(2000, TimeUnit.MILLISECONDS)
    .observeOn(Schedulers.io())
    .subscribeOn(AndroidSchedulers.mainThread())
    .subscribe(integer -> loadFinishAnimationAfterSetWallpaper());

但它并没有帮助。

But it didn't help.

推荐答案

AppObservable.bindFragment(这一点,Observable.just(0))抛出一个异常,因为它不叫从主线程

AppObservable.bindFragment(this, Observable.just(0)) throw an exception as it's not called from the Main Thread

因为你在这个code对 Schedulers.io 观察这code未在主线程调用(参见下文),比后者调用 AppObservable.bindFragment(这一点,Observable.just(0))

This code is not called in the main thread because you observe on Schedulers.io in this code (see bellow), than latter call AppObservable.bindFragment(this, Observable.just(0))

AppObservable.bindFragment(this, Observable.just(0))
   .observeOn(Schedulers.io())
   .subscribe(v -> setWallpaperOnSeparateThread());

您想在IO线程执行任务,然后在主线程执行任务。要做到这一点,你可以链接你调用使用一个观测

You want to perform a task in io thread, then perform a task in main thread. To do so, you can chain you call using one Observable.

AppObservable.bindFragment(this, Observable.just(0))
   .observeOn(Schedulers.io())
   .flatMap(v -> Observable.defer(() -> WallpaperHelper.setBitmapAsWallpaper(photoViewAttacher.getVisibleRectangleBitmap(), getBaseActivity())))
   .delay(500, TimeUnit.MILLISECONDS)
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe(v -> loadFinishAnimationAfterSetWallpaper());

请注意我用延迟重新presente你异步任务作为观测,但可以更换在 flatMap 通话与 doOnNext 电话。

Please note I use defer to represente you async task as an Observable but you can replace the flatMap call with doOnNext call.

AppObservable.bindFragment(this, Observable.just(0))
   .observeOn(Schedulers.io())
   .doOnNext(v -> WallpaperHelper.setBitmapAsWallpaper(photoViewAttacher.getVisibleRectangleBitmap(), getBaseActivity()))
   .delay(500, TimeUnit.MILLISECONDS)
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe(v -> loadFinishAnimationAfterSetWallpaper());

这篇关于RxAndroid:对Schedulers.io用户界面的变化()线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆