RxAndroid:对Schedulers.io用户界面的变化()线程 [英] RxAndroid: UI changes on Schedulers.io() thread
问题描述
我有这正在改变主屏幕墙纸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屋!