首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RxJava2 实战(1) - 后台执行耗时操作,实时通知 UI 更新

偶然机会看到了开源项目 RxJava-Android-Samples,这里一共介绍了十六种RxJava2使用场景,它从实际应用场景出发介绍RxJava2使用,特别适合对于RxJava2已经有初步了解开发者进一步地去学习如何将其应用到实际开发当中...示例 2.1 应用场景 当我们需要进行一些耗时操作,例如下载、访问数据库等,为了不阻塞主线程,往往会将其放在后台进行处理,同时在处理过程、处理完成后通知主线程更新UI,这里就涉及到了后台线程和主线程之间切换...使用AsyncTask,在其doInBackground方法执行耗时操作,调用publishProgress方法通知主线程,然后在onProgressUpdate更新进度显示,在onPostExecute...需要在主线程进行UI更新操作,对应于DisposableObserver所有回调,具体是在onNext中进行进度更新;在onComplete和onError展示最终处理结果。...Schedulers.immediate( ):在当前线程执行任务 Schedulers.io( ):用于IO密集型任务,例如访问网络、数据库操作等,也是我们最常使用

2.2K80

RxJava2 实战知识梳理(1) - 后台执行耗时操作,实时通知 UI 更新

偶然机会看到了开源项目 RxJava-Android-Samples,这里一共介绍了十六种RxJava2使用场景,它从实际应用场景出发介绍RxJava2使用,特别适合对于RxJava2已经有初步了解开发者进一步地去学习如何将其应用到实际开发当中...二、示例 2.1 应用场景 当我们需要进行一些耗时操作,例如下载、访问数据库等,为了不阻塞主线程,往往会将其放在后台进行处理,同时在处理过程、处理完成后通知主线程更新UI,这里就涉及到了后台线程和主线程之间切换...使用AsyncTask,在其doInBackground方法执行耗时操作,调用publishProgress方法通知主线程,然后在onProgressUpdate更新进度显示,在onPostExecute...需要在主线程进行UI更新操作,对应于DisposableObserver所有回调,具体是在onNext中进行进度更新;在onComplete和onError展示最终处理结果。...Schedulers.immediate():在当前线程执行任务 Schedulers.io():用于IO密集型任务,例如访问网络、数据库操作等,也是我们最常使用

65420
您找到你想要的搜索结果了吗?
是的
没有找到

Android 架构组件 - 让天下没有难做 App

Android 生命周期管理不当带来最大问题就是内存泄露,举一个我们经常遇到场景:一个异步任务(比如网络请求)持有了 UI 元素引用,只要任务没有执行完,所有与这个 UI 元素有强引用关系元素都没法被...为了异步对象引用问题,最早我们使用 AsyncTask,任务执行在 worker thread,执行结果在主线程上发起回调。...Github 上出现了不少 ORM 框架,但是它们易用性也不敢让人恭维,直到 Room 出来之后,Android 程序员终于可以像 mybatis 那样轻松地操纵数据库了。...虽然 Realm 也是一个优秀数据库,但是它并没有内置于 Android 系统,所会增大 apk 体积,使用 Room 则没有这方面烦恼。...,DataSource 就会给更多,当 DataSource 一无所有时便会触发 BoundaryCallback 获取更多数据直到数据全部展示完毕

1.2K20

livedatabus详解,阿里是如何用他来做淘宝架构

Android 生命周期管理不当带来最大问题就是内存泄露,举一个我们经常遇到场景:一个异步任务(比如网络请求)持有了 UI 元素引用,只要任务没有执行完,所有与这个 UI 元素有强引用关系元素都没法被...Github 上出现了不少 ORM 框架,但是它们易用性也不敢让人恭维,直到 Room 出来之后,Android 程序员终于可以像 mybatis 那样轻松地操纵数据库了。...虽然 Realm 也是一个优秀数据库,但是它并没有内置于 Android 系统,所会增大 apk 体积,使用 Room 则没有这方面烦恼。...(), factory) .get(ActorViewModel::class.java) 一通操作虎之后,UI controller 层变得薄蝉翼,它只做了一件事情,把数据从左手(...,DataSource 就会给更多,当 DataSource 一无所有时便会触发BoundaryCallback获取更多数据直到数据全部展示完毕

1.1K30

Android Room 持久化库

定义操作方法 这里只列出几个常用方法 Insert 当创建一个DAO方法并使用时候,Room会生成它实现并在单个事物中将所有参数插入。...它可以执行数据库读写操作。每一个 @Query 方法都会在编译时验证,如果出现问题也是在编译时出现问题不会在运行时出现问题。...使用 RxJava 进行响应查询 Room还可以从定义查询返回 RxJava2 Publisher 和 Flowable 对象。...要使用此功能,需要将 Room 组 android.arch.persistence.room:rxjava2 组件添加到构建Gradle依赖项,添加组件之后就可以返回 Rxjava2 对象...如果有单独事务并行运行,或者设备正在运行其他磁盘密集型任务,则查询可能需要更多时间才能完成。但是,如果不使用延迟加载,则应用会获取比所需更多数据,从而导致内存消耗问题。

3.9K70

MVVM数据持久化(一)——ROOM集成

能力同时允许流畅数据库访问,最主要是它让SQLiteDatabase使用变得简单,大大减少了重复代码,并且把SQL查询检查放在了编译时。...而且还可以和RxJava配合使用十分契合。 Room有3个主要组件 Database: 包含数据库持有者,并充当与应用程序持久化、关系型数据底层连接主要访问点。...在运行时,您可以通过调用Room.databaseBuilder()或Room.inMemoryDatabaseBuilder()获取数据库实例。 Entity: 表示数据库表。...三者关系图 加入依赖 以上简单介绍了一下Room 下面我们着重介绍如何在我们框架当中使用 首先加入依赖 implementation 'android.arch.persistence.room...Dao负责操作数据库方法,也就是说我们一些操作数据库动作都是在这里完成。不同是我们不需要这些都用Dao类当中注解来定义查询。

1.4K20

Android】期末简答题

计算机程序在港澳台地区称为程式。程序就是为使用电子计算机执行一个或多个操作,或执行某一任务,按序设计计算机指令集合。   进程(有时被称为重量级进程)是程序一次执行任务。...每一个进程都有自己地址空间、内存、数据栈以及其它记录器运行轨迹辅助数据操作系统管理子其运行所有进程,并为这些进程公平地分配时间。   ...(Intent intent)方法来处理耗时操作 在耗时操作执行完毕之后,会自动关闭service不用手动关闭 如果同时new出多个IntentService对象进行耗时操作,oncreate()和...(生命周期在应用程序进程主线程运行) 一个Service可以完成工作:访问网络(在Service启动分线程)、播放音乐、文件IO操作、大数据数据库操作等。...如果需要在Service处理一些网络连接等耗时操作,那么应该将这些任务放在分线程处理,避免在主线程阻塞用户界面。 特点:Service在后台运行,不用与用户进行交互。

94260

腾讯牛逼,连环追问我基础细节!

图和树等数据结构:例如,在图邻接表,可以使用双向链表来表示节点之间关系;在树子树,可以使用双向链表来表示节点兄弟关系。 数据库索引:在数据库,索引用于加快查询速度。...传统数据库索引是基于B+树,但是如果需要频繁地插入和删除数据,B+树修改和维护成本较高。双向链表索引修改方便,尤其适合多次插入和删除操作场景,因此双向链表索引在部分数据库中被使用。...以此类推,直到所有元素均排序完毕。...所以为了防止一个长时间运行任务阻塞其他任务,JavaScript采用了异步编程模式,回调函数、Promise和async/await等。...当异步操作完成时,会将对应回调函数放入任务队列。 当JavaScript执行栈为空时,事件循环会从任务队列取出一个任务执行。这个过程会不断重复,形成一个循环,直到所有任务执行完毕

16210

Android Paging库使用详解(小结)

implementation "android.arch.paging:rxjava2:1.0.0-rc1" } 备注: 分页包帮助开发者在UI列表容器顺畅地展示数据, 而不管是使用设备内部数据库还是从应用后端拉取数据...网络+数据库 在开始观测数据库之后, 你能够通过使用PagedList.BoundaryCallback来监听数据库什么时候过期. 之后, 你可能从网络拉取更多数据, 并把它们插入数据库....数据库例子 使用LiveData观测分页数据 下面的示例代码展示了所有一起工作碎片....你也可以使用JavaObject.equals()方法或者Kotlin==操作符. 但是要确保要么实现了对象equals()方法或者使用了kotlin数据对象....因为这个工作是在获取执行完成, 你可以在其中执行花销巨大工作, 比如, 从硬盘读取, 查询数据库等. 备注: JOIN查询总是比作为map()一部分查询要高效.

2K30

何在 Python 启动后台进程?

异步在开始之前,我们需要了解同步和异步编程区别。在同步编程,程序按顺序执行,每个操作完成后才进行下一个操作。而在异步编程,程序可以在等待某个操作完成同时继续执行其他操作。...以下是一个使用schedule库示例,执行每小时备份数据库任务:import scheduleimport timedef backup_database(): # 执行备份数据库任务...案例3:长时间运行任务有些任务需要较长时间才能完成,爬取大量网页数据或训练复杂机器学习模型。将这些任务放在后台进程运行可以确保主程序响应性。...我们使用multiprocessing.Process创建了一个新进程,并在其中执行一个模拟长时间运行任务。...我们还介绍了进程间通信和数据共享机制,队列和共享内存。在案例研究,我们探讨了几个实际应用场景,展示了如何使用后台进程来处理定时任务、并发处理和长时间运行任务

92040

何在 Python 启动后台进程?

异步在开始之前,我们需要了解同步和异步编程区别。在同步编程,程序按顺序执行,每个操作完成后才进行下一个操作。而在异步编程,程序可以在等待某个操作完成同时继续执行其他操作。...以下是一个使用schedule库示例,执行每小时备份数据库任务:import scheduleimport timedef backup_database(): # 执行备份数据库任务...案例3:长时间运行任务有些任务需要较长时间才能完成,爬取大量网页数据或训练复杂机器学习模型。将这些任务放在后台进程运行可以确保主程序响应性。...我们使用multiprocessing.Process创建了一个新进程,并在其中执行一个模拟长时间运行任务。...我们还介绍了进程间通信和数据共享机制,队列和共享内存。在案例研究,我们探讨了几个实际应用场景,展示了如何使用后台进程来处理定时任务、并发处理和长时间运行任务

28400

K8s优雅停机和零宕机部署

创建、删除 Pod 是 K8s 中最常见任务之一。本文介绍了 Pod 在响应创建、删除请求时发生内部流程,还讨论了如何在 Pod 启动或关闭时防止断开连接,以及如何正常关闭长时间运行任务。...K8sMeetup 在数据库中保存集群状态 API 接收并检查 Pod 定义,然后将其存储在 etcd 数据库。另外,Pod 将被添加到调度程序队列。...Pod 状态会存储在 etcd 。 但是 Pod 此时仍然是不存在,因为之前任务都发生在控制平面,Pod 状态仅存储在数据库。那么我们要如何在节点中创建 Pod?...由于组件可能忙于执行其他操作,因此无法保证从其内部状态删除 IP 地址将花费多长时间。有时候这可能不到一秒钟,但有时候可能需要更多时间。...宽限期越长,同时具有“运行”和“终止” Pod 也就越多。 K8sMeetup 终止长时间运行任务 如果我们要对大型视频进行转码,是否有任何方法可以延迟停止 Pod?

3.7K10

一种下载管理方案设计与实现

Android 2.3(API level 9)开始,Android以Service方式提供了全局DownloadManager来系统级地优化处理长时间下载操作。...1)以任务为单位完成单个文件下载 2)对每个任务使用多线程分段下载(对大文件有效) 3)支持任务断点续传 4)支持多任务管理和优先级调度 5)在数据库中保存所有未完成任务信息 6)实现完善异常保护机制...若下载任务被优先级更高任务插队,则转化为排队状态。若下载任务被停止或产生异常(网络中断),则转入已停止状态(数据库同步任务信息)。任务下载完成后自动销毁(删除)。...,从数据库读取任务信息(本次运行未启动过该任务下载) else { LogUtil.logD(TAG, "不是运行已暂停任务,从数据库恢复");...可根据MD5进行文件完整性校验。 3)初始化和同步数据库任务信息和线程信息。历史任务直接恢复线程信息。使用多线程,线程数根据每个线程最大长度配置值计算得出。

2.5K110

流媒体与实时计算,Netflix公司Druid应用实践

一旦有了这些数据,就将它们存入数据库,这里使用是实时分析数据库Druid。 每项数据流均标有关于所用设备类型匿名详细信息,例如,该设备是智能电视,iPad还是Android手机。...代理将执行最终合并和聚合,然后再将结果集发送回客户端。 摄取数据数据实时插入到此数据库。这些事件(在本例为指标)不是从单个记录插入数据,而是从Kafka流读取。...这种汇总形式可以显着减少数据库行数,从而加快查询速度,因为这样我们就可以减少要操作和聚合行。 一旦累积行数达到某个阈值,或者该段已打开太长时间,则将这些行写入段文件并卸载到深度存储。...即使在索引任务合并了相同行汇总,在相同索引任务实例获得所有相同行机会也非常低。为了解决这个问题并实现最佳汇总,我们安排了一个任务,在将给定时间块所有段都移交给历史节点之后运行。...计划压缩任务从深度存储获取所有分段以进行时间块化,并执行映射/缩小作业以重新创建分段并实现完美的汇总。然后,由“历史记录”节点加载并发布新细分,以替换并取代原始,较少汇总细分。

82610

Android MVVM框架搭建(三)MMKV + Room + RxJava2

使用 五、源码 前言   在上一篇文章,我讲述了怎么在MVVM框架搭建网络访问框架,并通过一个必应每日壁纸做了一次请求接口访问演示,这篇文章就需要来讲述Android本地数据库使用和在MVVM...下面运行一下,只要进入到LoginActivity即可: 是不是可以呢?可以的话就进行下一步了,Room使用了。记得把测试代码给删掉啊。...然后在db包下新建一个bean包,bean包下新建一个Image类,我们可以分析一下需要存到数据库值,是否所有数据都要存入,不要做没必要事情,那是给自己找事。...四、RxJava2   Room数据库使用是可以支持RxJava2、RxJava3,这里我们使用RxJava2,在前面添加依赖时候就已经添加进去了,因为要很好解决Room数据处理方式归根究底还是要做线程处理...由于读取速率可能 远大于 观察者处理速率,故使用背压 Flowable 模式,这是为了防止表数据过多,读取速率远大于接收数据,从而导致内存溢出问题,Completable就是操作完成回调,可以感知操作成功或失败

1.1K20

Android MVVM框架搭建(三)MMKV + Room + RxJava2

使用 五、源码 前言   在上一篇文章,我讲述了怎么在MVVM框架搭建网络访问框架,并通过一个必应每日壁纸做了一次请求接口访问演示,这篇文章就需要来讲述Android本地数据库使用和在MVVM...下面运行一下,只要进入到LoginActivity即可: 是不是可以呢?可以的话就进行下一步了,Room使用了。记得把测试代码给删掉啊。...然后在db包下新建一个bean包,bean包下新建一个Image类,我们可以分析一下需要存到数据库值,是否所有数据都要存入,不要做没必要事情,那是给自己找事。...四、RxJava2   Room数据库使用是可以支持RxJava2、RxJava3,这里我们使用RxJava2,在前面添加依赖时候就已经添加进去了,因为要很好解决Room数据处理方式归根究底还是要做线程处理...由于读取速率可能 远大于 观察者处理速率,故使用背压 Flowable 模式,这是为了防止表数据过多,读取速率远大于接收数据,从而导致内存溢出问题,Completable就是操作完成回调,可以感知操作成功或失败

1.2K31

数据库PostrageSQL-日常数据库维护工作

日常数据库维护工作 和任何数据库软件一样,PostgreSQL需要定期执行特定任务来达到最优性能。...这里讨论任务是必需,但它们本质上是重复性并且可以很容易使用cron脚本或Windows任务计划程序等标准工具来自动进行。建立合适脚本并检查它们是否成功运行数据库管理员职责。...PostgreSQL备份和恢复机制在Chapter 25有详细介绍。 另一种主要类型维护任务是周期性地“清理”数据库。该活动在Section 24.1讨论。...某些数据库管理员会希望使用手动管理VACUUM命令来对后台进程活动进行补充或者替换,这通常使用cron或任务计划程序脚本来执行。要正确地设置手动管理清理,最重要是理解接下来几小节讨论问题。...对于那些不使用自动清理用户,一种典型方法是计划一个数据库范围VACUUM,该操作每天在低使用量时段执行一次,并根据需要辅以在重度更新表上更频繁清理(一些有着极高更新率安装会每几分钟清理一次它们最繁忙

1.5K21

使用kotlin协程提高app性能(译)

Android上,协程有助于解决两个主要问题: 管理长时间运行任务,否则可能会阻止主线程并导致应用冻结。 提供主安全性,或从主线程安全地调用网络或磁盘操作。...本主题描述了如何使用Kotlin协程解决这些问题,使您能够编写更清晰,更简洁应用程序代码。 管理长时间运行任务Android上,每个应用程序都有一个主线程来处理用户界面并管理用户交互。...网络请求,JSON解析,从数据库读取或写入,甚至只是迭代大型列表都可能导致应用程序运行缓慢,导致可见缓慢或冻结UI对触摸事件响应缓慢。这些长时间运行操作应该在主线程之外运行。...因为withContext()允许您控制任何代码行线程池而不引入回调,所以您可以将它应用于非常小函数,例如从数据库读取或执行网络请求。...使用适用于Android体系结构KTX库组件,您还可以使用扩展属性viewModelScope来创建可以运行协同程序,直到ViewModel被销毁。

2.3K10

AAC---Room使用

通过注解方式来进行数据库配置,以及SQL查询,并且在编译过程,会检查SQL以及数据库配置等正确性,同时也支持外键、事务等。..."android.arch.persistence.room:testing:$room_version" } 定义数据库 使用entities定义在数据库存储实体结构 使用version定义数据库版本...SQL以及增删改查操作 Query可以定义参数,通过:param方式在编译期间,生成对应SQL语句,从而进行查询 剩下插入,删除,更新可以定义单个或者多个对象进行批量更新 除了查询外操作都会是一个...Transaction 插入,删除,更新操作都是根据PrimaryKey匹配进行操作 Query操作可以返回Cursor,LiveData Query参数也可以是一个List对象, @Dao public...Builder获取数据库对象,并且获取DAO对象后,进行操作

1.3K20

现代 WorkManager API 已发布

再举另外一个例子,当您应用完成与后端同步数据后,也许您希望同步过程中产生本地日志文件被及时清理,或者是将来自后端数据填充到本地数据库。...加急工作需要在某个前台服务上下文中运行,这很类似于 Android 12 之前版本长时间运行工作。...这样一来,您就可以完全避免所有刚才提到跨进程 SQLite 争用,因为从开始到结束只有唯一一个进程在向底层 SQLite 数据库写入数据。...使用 RemoteWorkManager 后,会通过绑定服务绑定到主进程并将所有工作请求进行转发,然后存储到特定队列等待执行。...总结 WorkManager 是应对长执行时间工作推荐方案,推荐您使用 WorkManager 实现请求和取消长时间运行工作任务

1.2K20
领券