协程作用域概念迭代RxTask 实现自主控制

目录
  • 结合协程作用域概念迭代 RxTask 实现作用域功能
    • 作用域的设想及机制
  • ITaskScope 的实现
  • 基于 Android 平台拓展支持
  • 总结

结合协程作用域概念迭代 RxTask 实现作用域功能

在过去的一段时间里有幸接触过某个项目,整体技术方案落后且线程滥用导致出现大量的内存泄漏或者资源反复耗费。原因在于这个项目中对 RxJava 创建操作不规范,反复创建线程且不及时消耗导致,刚好朋友在使用我的 RxTask 开源项目中也给我反馈一件事,能否提供一个类似像协程作用域概念,当被告知需要消耗时则及时把 RxTask 销毁。故此针对 RxTask 进行迭代升级有兴趣的同学可以了解下 RxTask 的设计及实现理念

作用域的设想及机制

熟悉 RxTask 的同学们都知道在原有的 RxTask 设计理念并没有存在 ITaskScope 这一概念,这一概念可以理解为限制当前创建的 RxTask 存活在某一对象中,当该对象被销毁时通过 ITaskScope 实例接口及时告知 RxTask 进行销毁操作。避免 RxTask 还在运行,譬如在 Android 环境中 Activity 运行一个异步 RxTask 由于Activity 在某些场景被销毁时,RxTask 来不及销毁仍然继续执行最终执行完成时回到 Activity 操作相关 UI 此时,则会报出异常从而导致崩溃或 RxTask 持续运行中不断消耗资源导致内存一直抖动,当然这都是因为开发者没有及时的控制好RxTask 出现的问题。为此提出 ITaskScope 概念,通过实现 ITaskScope 将 RxTask 与某个对象生命作用域进行关联从而及时进行销毁避免出现上诉问题。

接下来请看机制时序图:

从机制图中可以得到当 scope 处于销毁动作时则会告知 Task 对象让其取消执行,最后释放资源。

ITaskScope 的实现

那么 ITaskScope 接口定义如下

interface ITaskScope {
    fun scopeOnDestroy()
    fun subScope(callAction: ITaskScopeCallAction?)
}
interface ITaskScopeCallAction {
    fun doOnScopeDestroyAction()
}

为什么在 ITaskScope 接口中会多出一个 ITaskScopeCallAction 接口呢?

其实同学可以这样理解 ITaskScope 仅仅负责在某个对象中持有单个或多 RxTask 对象,该对象处于销毁时期时及时调用 ITaskScope.scopeOnDestory() 方法去告知被持有 RxTask 对象们及时销毁,此刻为了避免 ITaskScope 对象会直接操作或联系 RxTask 对象那么,通过 ITaskScopeCallAction 去进行告知相关 RxTask 进行相应操作。

那么 ITaskScopeCallAction 仅仅负责处理销毁操作回调事件即可。

同学们还记得 RxTask 奠基石接口 ITask 吗?没错既然我们把 ITaskScopeITaskScopeCallAction 声明了那么,我们则需要利用 ITask 接口声明ITaskScope 绑定关系。

interface ITask<RESULT> {
    //启动
    fun start()
    //取消
    fun cancel()
    fun bindScope(scope: ITaskScope?): ITask<RESULT>?
}

接下来再 RxTask 核心基类中实现关联关系即可:

abstract class ISuperTask<RESULT> : ITask<RESULT> {
    protected var taskScope: ITaskScope? = null
    protected var iTaskScopeCallAction: ITaskScopeCallAction = object : ITaskScopeCallAction {
        override fun doOnScopeDestroyAction() {
            cancel()
        }
    }
    override fun bindScope(scope: ITaskScope?): ITask<RESULT>? {
        scope?.subScope(iTaskScopeCallAction)
        return this
    }
}

基于 Android 平台拓展支持

熟悉 RxTask 库的同学们,都会清晰知道 RxTask 分为 libRxTasklibRxTaskAndroidExpand :

libRxTask 作为 RxTask 基准及核心实现并支持后端直接使用。

libRxTaskAndroidExpand 作为对 Android 平台进行拓展简单延伸的封装。

那么在 libRxTaskAndroidExpand 库中我们可以结合 Lifecycle 实现一个简单封装的 Scope 对象给同学们使用。

详细实现如下:

class RxTaskAndroidBasePageScope : ITaskScope, LifecycleEventObserver {
    var canelByStopStatus = false
    var cancelByPauseStatus = false
    var cancelByDestroyStatus = true
    private var observers: MutableList<ITaskScopeCallAction> = mutableListOf()
    override fun scopeOnDestroy() {
        observers.forEach { it?.doOnScopeDestroyAction() }
    }
    override fun subScope(callAction: ITaskScopeCallAction?) {
        callAction?.let {
            if (!observers.contains(it))
                observers.add(it)
        }
    }
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        when (event) {
            Lifecycle.Event.ON_PAUSE -> {
                if (cancelByPauseStatus) {
                    scopeOnDestroy()
                    return
                }
            }
            Lifecycle.Event.ON_STOP -> {
                if (canelByStopStatus) {
                    scopeOnDestroy()
                    return
                }
            }
            Lifecycle.Event.ON_DESTROY -> {
                if (cancelByDestroyStatus) {
                    scopeOnDestroy()
                    return
                }
            }
            else -> {
            }
        }
    }
}

那么使用如下(以 android 平台为例子):

class MainActivity : AppCompatActivity() {
    val scope = RxTaskAndroidBasePageScope()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        lifecycle.addObserver(scope)
        RxTaskAndroidDefaultInit.instant.defaultInit()
//
        val task = object : SingleEvaluation<*> {
            override fun evluation(task: RxSingleEvaluationTask<*>): Object {
                //do your logic
                return JsonObject()
            }
        }.getTask()
        .bindScope(scope)
        .start()
    }
}

总结

写出一个库其实不难,难点在于如何理解通用性、简易性、拓展性、维护性,更重要的是需要虚心接受各方建议及反馈并进行修改,持续更新改进

以上就是协程作用域概念迭代RxTask 实现自主控制的详细内容,更多关于RxTask 自主控制的资料请关注我们其它相关文章!

(0)

相关推荐

  • python 协程中的迭代器,生成器原理及应用实例详解

    本文实例讲述了python 协程中的迭代器,生成器原理及应用.分享给大家供大家参考,具体如下: 1.迭代器理解 迭代器: 迭代器是访问可迭代对象的工具 迭代器是指用iter(obj)函数返回的对象(实例) 迭代器是指用next(it)函数获取可迭代对象的数据 迭代器函数(iter和next) iter(iterable)从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象 next(iterator) 从迭代器iterator中获取下一了记录,如果无法获取下一条记录,则触发

  • Android协程作用域与序列发生器限制介绍梳理

    目录 一.受限协程作用域 1.sequence方法 2.SequenceScope类 二.序列发生器 1.Sequence接口 2.Sequence方法 3.iterator方法 4.SequenceBuilderIterator类 1.SequenceBuilderIterator类的全局变量 2.yield方法与yieldAll方法 3.hasNext方法 4.next方法 5.总结 一.受限协程作用域 在协程的基础与使用中提到,可以通过sequence方法构建一个序列发生器.但当在sequ

  • Android编程设计模式之迭代器模式详解

    本文实例讲述了Android编程设计模式之迭代器模式.分享给大家供大家参考,具体如下: 一.介绍 迭代器模式(Iterator Pattern)又称为游标(Cursor)模式,是行为型设计模式之一.迭代器模式算是一个比较古老的设计模式,其源于对容器的访问,比如Java中的List.Map.数组等,我们知道对容器对象的访问必然会涉及遍历算法,我们可以将遍历的方法封装在容器中,或者不提供遍历方法.如果我们将遍历的方法封装到容器中,那么对于容器类来说就承担了过多的功能,容器类不仅要维护自身内部的数据元

  • 一文搞懂​​​​​​​python可迭代对象,迭代器,生成器,协程

    目录 设计模式:迭代 python:可迭代对象和迭代器 为什么要有生成器? python的生成器实现 协程 设计模式:迭代 迭代是一种设计模式,解决有序便利序列的问题.通用的可迭代对象需要支持done和next方法. 伪代码如下: while not iterator.done(): item = iterator.next() ..... python:可迭代对象和迭代器 python的可迭代对象需要实现__iter__()方法,返回一个迭代器.for循环和顶级函数iter(obj)调用obj

  • C#迭代器及Unity协程实例解析

    1.C#迭代器 1.1.IEnumerable和IEnumerator C#中的迭代器封装在IEnumerable和IEnumerator和他们的泛型接口中. IEnumerable:定义了一个可以获取IEnumerator的方法---GetEnumerator(). //IEnumerable的代码实现 public interface IEnumerable { IEnumerator GetEnumerator(); } IEnumerator:则在目标序列上实现循环迭代,直到不再需要数据

  • Android中的Coroutine协程原理解析

    前言 协程是一个并发方案.也是一种思想. 传统意义上的协程是单线程的,面对io密集型任务他的内存消耗更少,进而效率高.但是面对计算密集型的任务不如多线程并行运算效率高. 不同的语言对于协程都有不同的实现,甚至同一种语言对于不同平台的操作系统都有对应的实现. 我们kotlin语言的协程是 coroutines for jvm的实现方式.底层原理也是利用java 线程. 基础知识 生态架构 相关依赖库 dependencies { // Kotlin implementation "org.jetb

  • Android kotlin+协程+Room数据库的简单使用

    Room Room是Google为了简化旧版的SQLite操作专门提供的 1.拥有了SQLite的所有操作功能 2.使用简单(类似于Retrofit),通过注解的方式实现相关功能.编译时自动生成实现类impl 3.LiveData,LifeCycle,Paging天然融合支持 导入 ... plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-android-extensions' id 'kotlin-kap

  • 协程作用域概念迭代RxTask 实现自主控制

    目录 结合协程作用域概念迭代 RxTask 实现作用域功能 作用域的设想及机制 ITaskScope 的实现 基于 Android 平台拓展支持 总结 结合协程作用域概念迭代 RxTask 实现作用域功能 在过去的一段时间里有幸接触过某个项目,整体技术方案落后且线程滥用导致出现大量的内存泄漏或者资源反复耗费.原因在于这个项目中对 RxJava 创建操作不规范,反复创建线程且不及时消耗导致,刚好朋友在使用我的 RxTask 开源项目中也给我反馈一件事,能否提供一个类似像协程作用域概念,当被告知需要

  • Kotlin创建一个好用的协程作用域

    目录 前言 正文 前言 kotlin中使用协程,是一定要跟协程作用域一起配合使用的,否则可能协程的生命周期无法被准确控制,造成内存泄漏或其他问题. 我们一般在安卓项目中使用协程作用域,可能会在BaseActtivity中new 一个MainScope(),并在onDestory时cancel掉,或者只在ViewModel中使用viewModelScope,然后会在ViewModel的onClose中自动cancel掉. 但我们可能不只需要这些效果,比如在协程作用域中拿到Context或Activ

  • Kotlin协程概念原理与使用万字梳理

    目录 一.协程概述 1.概念 2.特点 3.原理 二.协程基础 1.协程的上下文 2.协程的作用域 3.协程调度器 4.协程的启动模式 5.协程的生命周期 三.协程使用 1.协程的启动 2.协程间通信 3.多路复用 4.序列生成器 5.协程异步流 6.全局上下文 一.协程概述 1.概念 协程是Coroutine的中文简称,co表示协同.协作,routine表示程序.协程可以理解为多个互相协作的程序.协程是轻量级的线程,它的轻量体现在启动和切换,协程的启动不需要申请额外的堆栈空间:协程的切换发生在

  • Kotlin协程的基础与使用示例详解

    目录 一.协程概述 1.概念 2.特点 3.原理 1)续体传递 2)状态机 二.协程基础 1.协程的上下文 2.协程的作用域 3.协程调度器 4.协程的启动模式 5.协程的生命周期 1)协程状态的转换 2)状态标识的变化 三.协程使用 1.协程的启动 1)runBlocking方法 2)launch方法 3)async方法 4)suspend关键字 5)withContext方法 6)suspend方法 2.协程间通信 1)Channel 2)Channel的容量 3)produce方法与act

  • Kotlin协程到底是如何切换线程的

    随着kotlin在Android开发领域越来越火,协程在各个项目中的应用也逐渐变得广泛 但是协程到底是什么呢? 协程其实是个古老的概念,已经非常成熟了,但大家对它的概念一直存在各种疑问,众说纷纷 有人说协程是轻量级的线程,也有人说kotlin协程其实本质是一套线程切换方案 显然这对初学者不太友好,当不清楚一个东西是什么的时候,就很难进入为什么和怎么办的阶段了 本文主要就是回答这个问题,主要包括以下内容 1.关于协程的一些前置知识 2.协程到底是什么? 3.kotlin协程的一些基本概念,挂起函数

  • kotlin之协程的理解与使用详解

    前言         为什么在kotlin要使用协程呢,这好比去了重庆不吃火锅一样的道理.协程的概念并不陌生,在python也有提及.任何事务的作用大多是对于所依赖的环境相应而生的,协程对于kotlin这门语言也不例外.协程的优点,总的来说有如下几点:轻量级,占用更少的系统资源: 更高的执行效率: 挂起函数较于实现Runnable或Callable接口更加方便可控: kotlin.coroutine 核心库的支持,让编写异步代码更加简单.当然在一些不适应它的用法下以上优势也会成为劣势. 1.协程

  • kotlin 协程上下文异常处理详解

    目录 引言 一.协程上下文 1.CoroutineContext 2.CorountineScope 3.子协程继承父协程 二.协程的异常传递 1.协程的异常传播 2.不同上下文(没有继承关系)之间协程异常会怎么样? 3.向用户暴露异常 三.协程的异常处理 使用SupervisorJob 异常捕获器CoroutineExceptionHandler Android中全局异常的处理 引言 从前面我们可以大致了解了协程的玩法,如果一个协程中使用子协程,那么该协程会等待子协程执行结束后才真正退出,而达

  • Kotlin 协程思维模型的引入使用建立

    目录 1.协程 2.Kotlin协程 1.引入Kotlin协程 2.Kotlin协程的使用 3.Kotlin协程的轻量(总结的还不够清晰) 4.协程的“非阻塞式” 5.建立思维模型 1.协程 协程不是进程或线程,它的执行过程更类似于子例程或者说不带返回值的函数调用. 一个程序可以包含多个协程,类似于一个进程包含多个线程.线程有自己的上下文多个线程存在时它们相对独立,切换受系统控制,而协程也相对独立,也有自己的上下文,但是切换是由自己控制的,当需要切换到其他协程时是由当前协程控制的. 线程 协程

随机推荐