cza*_*666 5 java multithreading android rx-java rx-android
我在IO线程上有简单的工作,正在改变主屏幕壁纸,之后我试图在UI线程上运行一些动画:
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());
}
Run Code Online (Sandbox Code Playgroud)
但这种方法导致错误:
java.lang.IllegalStateException: Observers must subscribe from the main UI thread, but was Thread[RxCachedThreadScheduler-1,5,main]
我试图将第二个Observable改为:
AppObservable.bindFragment(this, Observable.just(0))
.delay(2000, TimeUnit.MILLISECONDS)
.observeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(integer -> loadFinishAnimationAfterSetWallpaper());
Run Code Online (Sandbox Code Playgroud)
但它没有帮助.
dwu*_*sen 10
AppObservable.bindFragment(this, Observable.just(0)) 抛出异常,因为它没有从主线程中调用
这个代码不是在主线程中调用的,因为你Schedulers.io在这段代码中看到了(见下文),而不是后面的调用AppObservable.bindFragment(this, Observable.just(0))
AppObservable.bindFragment(this, Observable.just(0))
.observeOn(Schedulers.io())
.subscribe(v -> setWallpaperOnSeparateThread());
Run Code Online (Sandbox Code Playgroud)
您想在io线程中执行任务,然后在主线程中执行任务.为此,您可以使用一个链接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());
Run Code Online (Sandbox Code Playgroud)
请注意我defer用来表示您的异步任务,Observable但您可以用flatMap呼叫替换doOnNext呼叫.
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());
Run Code Online (Sandbox Code Playgroud)
实际上observeOn用于subcscriber线程,而subscribeOn用于可观察线程.所以你应该扭转它们
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7035 次 |
| 最近记录: |