当前位置: 首页 > 知识库问答 >
问题:

RxAndroid:调度程序上的UI更改。io()线程

易弘阔
2023-03-14

我在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());
}

但这种方法会导致错误:<代码>java。lang.IllegalStateException:观察者必须从主UI线程订阅,但它是线程[RxCachedThreadScheduler-1,5,main]

我尝试将第二个可观察更改为:

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

但这于事无补。

共有2个答案

微生欣怡
2023-03-14

实际上观察是针对订阅者线程的,而订阅是针对可观察线程的。所以你应该反转它们

.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
李康安
2023-03-14

<代码>可观察。bindFragment(这是可观察的。只有(0))抛出异常,因为它不是从主线程调用的

此代码没有在主线程中调用,因为您在调度程序上观察到。io在此代码中(参见下文),而不是后者调用AppObservable。bindFragment(这个,可观察的。只有(0))

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

您希望在io线程中执行任务,然后在主线程中执行任务。要做到这一点,您可以使用一个可观察的链接调用。

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());

请注意,我使用“延迟”将异步任务表示为可观察的,但您可以用“下一步”调用替换“平面图”调用。

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());
 类似资料:
  • 我是一个新的Android和工作在这个聊天应用,在那里我想改变一个activity元素基于预定的数据,在预定的确切时间。它不一定要工作时,应用程序或电话关闭,但我想发送通知,以及与更改。有AlarmManager、JobScheduler、Handler、Timer和WorkManager,但我对它们之间的比较感到非常困惑。在这种情况下哪一个是最好的选择?

  • 我使用RxJava2 Android网络的网络调用。我面临的问题是,当我试图通过命中API时,有时它不会给出任何响应,而当我试图通过命中API时,它总是给出回应 和

  • 问题内容: 我正在尝试为我的项目需求实现简单的调度程序,我的项目正在使用。到目前为止,我浏览了Adobe网站并尝试实现所提供的示例,但是没有一个示例可以更新我的文件。 因此,根据这个,它应该工作 依赖 我是否需要进行其他任何更改才能使调度程序正常工作?请建议缺少的内容。 问题答案: 以下解决方案按要求工作,这里处理了三种情况 with :每分钟执行一次作业 with :每3分钟执行一次作业 wit

  • 我正在尝试学习一些RxJava和RxAndroid,我认为我遇到的问题可以很容易地使用这样的工具来解决。问题是:我们可以在一个活动中有“N”个视图,并且每个视图都用于满足某些条件。当用户按“保存”时,我们想检查所有视图中是否满足所有条件,如果不满足,请用户分别确认每个视图。所以这是我在没有RxJava的情况下如何处理这个问题的示例: 显然,我需要某种类型的监听器来确认结果,并且在条件被确认后(使用

  • 我有一个非常简单的DIV元素,我试图调整大小并水平拖动。它工作得很好,但是DIV元素的高度也会被jQueryUI改变。我不明白为什么。 有人有主意吗? JS代码: 超文本标记语言代码: CSS代码:

  • 但没有。在应用程序中创建的dispatcher线程使我在优化dispatcher配置时束手无策。每次重新启动应用程序时,我都看到创建了不同数量的dispatcher线程(每次启动应用程序后,我都通过线程转储检查这一点)。 甚至线程数也不等于我在Parallelism-min中定义的线程数。由于这个低线程数,我的应用程序的处理速度非常慢。一查号码。通过下面的代码: GetRuntime().Avai