網站首頁 編程語言 正文
結合協程作用域概念迭代 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
嗎?沒錯既然我們把 ITaskScope
、ITaskScopeCallAction
聲明了那么,我們則需要利用 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
分為 libRxTask
及 libRxTaskAndroidExpand
:
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() } }
總結
寫出一個庫其實不難,難點在于如何理解通用性、簡易性、拓展性、維護性,更重要的是需要虛心接受各方建議及反饋并進行修改,持續更新改進
原文鏈接:https://juejin.cn/post/7155791036114010148
相關推薦
- 2022-07-22 HttpClient如何自定義重試方法
- 2022-03-13 C語言實現求解最小公倍數的算法示例_C 語言
- 2022-05-01 Python類的定義和使用詳情_python
- 2022-12-29 python解決循環依賴的問題分析_python
- 2022-05-15 Element框架里日期選擇器限制時間,最多選31天
- 2022-06-23 android中的adb命令學習_Android
- 2022-10-09 python將寫好的程序打包成exe可執行文件_python
- 2023-12-09 出現錯誤:SLF4J: Class path contains multiple SLF4J bin
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支