结合协程作用域概念迭代 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 自主控制的资料请关注Devmax其它相关文章!

协程作用域概念迭代RxTask 实现自主控制的更多相关文章

  1. ios – 不同作用域中相同命名常量的链接器错误

    我有一个名为“ID_KEY”的常量,它在3个单独的.m文件的顶部声明,其中没有包含其他文件.声明如下:而其他两个类也是如此.但是我收到一个链接器错误抱怨同名的多个定义.我的问题是为什么链接器抱怨这个呢?

  2. 15.6 Swift局部引用

    /**局部引用和全局引用1.作用域2.生命周期*/varref:Int=Int.init/**定义一个变量或者常量,如果不是可选类型的话,一定要有初始值。所谓的局部引用就是在代码块里面的引用就是局部引用。作用域生命周期都在该代码块中;离它最近的括号*/iftrue{varref:Student=Student.initref.name="ZHangsan"}//超出作用域啦//ref.name="ZHangsan"

  3. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  4. 一起来了解JavaScript的变量作用域

    这篇文章主要为大家详细介绍了JavaScript变量作用域,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

  5. Angular的MVC和作用域

    本文主要Angular的MVC和作用域进行详细分析介绍,具有一定的参考价值,下面跟着小编一起来看下吧

  6. Javascript学习笔记之函数篇(六) : 作用域与命名空间

    本文主要讲述了javascript中作用域和命名空间的区别,十分的详细,这里推荐给大家,希望小伙伴能有所收获

  7. Python协程实践分享

    这篇文章主要分享的是Python协程实践,协程简单来说就是一个更加轻量级的线程,并且不由操作系统内核管理,完全由程序所控制,下文相关介绍需要的朋友可以参考一下

  8. Kotlin 协程异步热数据流的设计与使用讲解

    这篇文章主要为大家介绍了Kotlin 协程协程异步热数据流的设计与使用讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. JavaScript基础之作用域

    这篇文章主要介绍了如何理解JavaScript中的作用域,帮助大家更好的学习JavaScript,感兴趣的朋友可以了解下

  10. 一文彻底搞懂Kotlin中的协程

    这篇文章主要给大家介绍了Kotlin中协程的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部