RxAndroid:Schedulers.io() 线程上的 UI 更改

2024-01-03

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

但这没有帮助。


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

您想要在 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());

请注意我使用defer将您的异步任务表示为Observable但你可以更换flatMap打电话给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());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RxAndroid:Schedulers.io() 线程上的 UI 更改 的相关文章

随机推荐

  • 将 php 脚本作为守护进程运行

    我需要运行一个 php 脚本作为守护进程 等待指令并执行操作 cron 作业不会为我做这件事 因为指令到达后需要立即采取行动 我知道由于内存管理问题 PHP 并不是守护进程的最佳选择 但由于各种原因 我在这种情况下必须使用 PHP 我遇到了
  • 在C中逐行读取文件

    Preface 这道题是关于逐行读取文件 并将每一行插入到一个链表中 我已经编写了链表的实现 并测试了insert 手动功能 这有效 我还编写了从文件中读取文本并将其写出的代码 同样 这也有效 好的 这是我的问题 我怎样才能合并这些概念 以
  • Dart:将十进制转换为十六进制

    我一直在寻找一种在 Dart 编程语言中将十进制数转换为十六进制格式的方法 The hex encode方法中的HexCodec例如 类无法转换十进制 1111 其十六进制值为 457 而是给出异常 FormatException 无效字节
  • 我应该在函数中抛出 IllegalArgumentException 吗?

    我正在构建一个包含大量计算的科学软件 当然参数可能有错误的长度等 所以我使用IllegalArgumentException类 因为它似乎是这个问题的正确名称 但我应该把throws IllegalArgumentException在函数定
  • 如何使用 python 中的循环创建多个目录?

    我想用循环创建 10 个目录 我尝试了以下代码 import os pathname 1 directory C Directory Path Name str pathname while pathname lt 11 if not os
  • 右移和有符号整数

    在我的编译器上 以下伪代码 值替换为二进制 sint32 word 10000000 00000000 00000000 00000000 word gt gt 16 产生一个word位字段如下所示 11111111 11111111 10
  • 在tomcat中共享文件夹

    如何使用 tomcat 6 浏览器访问文件夹 我想我需要向 web xml 添加上下文 我想 所以当我导航到http localhost 8080 myfiles http localhost 8080 myfiles我希望看到 c tem
  • 如何在 Windows 上以提升的权限运行脚本?

    我一直在试图弄清楚如何运行一堆都需要提升权限的应用程序 DameWare MSC exe PowerShell exe 和 SCCM Manager Console 等应用程序都在我的日常工作中使用 我现在运行的是Win7 计划最终迁移到W
  • Wp7 键盘支持多少种语言以及如何设置

    我希望为 Windows Phone 7 创建一个翻译应用程序 我不知道如何去做 这里是问题 我想知道当我在文本框中输入文本进行翻译时 我该怎么做 1 假设 我的Windows手机是中文的 如何将其更改为其他语言 例如法语 德语 俄语等 我
  • C 语言的限制输出

    在 C 中 我想将字符串限制为前 8 个字符 例如 我有 char out printf c str 我怎样才能使它只返回前 8 个字符 您可以通过设置格式说明符中的精度来限制长度 printf 8s str 这将打印up to指向的以空字
  • Maven Cobertura 插件未生成coverage.xml

    我试图生成一个coverage xml 以便我可以在Hudson 的Cobertura 插件中引用它 但该文件没有被创建 我已将以下内容添加到我的 POM 中
  • 如何在.net core中使用反射通过名称查找类的名称空间?

    我有一个仅包含类名称的字符串列表 我需要使用 Activator 创建它们的实例 但它们都可以位于不同的命名空间中 类将来可以移动到另一个名称空间中 因此我无法对其进行硬编码 如果您知道永远不会有多个具有相同名称的类型驻留在不同的命名空间中
  • 检测已安装的浏览器,以便 Process.Start("chrome") 不会出错

    我试图让用户选择我的应用程序用来启动网址的浏览器 目前它使用默认浏览器 但有些人想指定不同的浏览器 我想仅显示列表中已安装的浏览器 并且我将像这样启动它们 Process Start chrome url 更多信息 https learn
  • cakephp 复选框显示额外的隐藏字段

    foreach apps as app echo this gt Form gt input Application array type gt checkbox id gt app Application description div
  • Maven 发布:如何跳过部署步骤?

    要发布我正在使用的应用程序maven 发布 插件 此过程中的一个步骤是将版本部署到存储库中 我想避免这一步 但是当我从 pom 文件中删除 distributionManagement 时 出现错误 Deployment failed re
  • 更改端口号后无法在 Visual Studio 中调试?

    我添加了这一行 UseUrls http 5000 使其他主机的客户端能够访问 Web api public static void Main string args var host new WebHostBuilder UseKestr
  • 为什么sbt找不到KafkaUtils?

    我在使用 SBT 编译的代码 来自 Kafka 的 wordCount 中出现此错误 error home hduser sbt project project1 src main scala sparkKafka scala 4 35 o
  • Python:使用已知 URL 但未知驱动器号访问 Windows 映射网络驱动器

    我正在尝试编写一个可以在远程 Linux 服务器上移动和复制文件的 Python 脚本 但是 我不能假设运行该脚本 在 Windows 上 的每个人都会将此服务器映射到同一个字母 我不想提示用户输入正确的盘符 而是想简单地通过服务器的网络
  • SQLAlchemy db.session.query() 与 model.query

    对于简单的返回所有结果查询 是否应该优先选择一种方法 我可以在网上找到两者的用途 但无法真正找到任何描述差异的内容 db session query my model name all my model name query all 我觉得
  • RxAndroid:Schedulers.io() 线程上的 UI 更改

    我在 IO 线程上有一个简单的工作 即更改主屏幕壁纸 之后我尝试在 UI 线程上运行一些动画 AppObservable bindFragment this Observable just 0 observeOn Schedulers io