最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

協(xié)程作用域概念迭代RxTask?實現(xiàn)自主控制

 更新時間:2022年10月20日 14:07:54   作者:king@killer  
這篇文章主要為大家介紹了協(xié)程作用域概念迭代RxTask實現(xiàn)自主控制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

結(jié)合協(xié)程作用域概念迭代 RxTask 實現(xiàn)作用域功能

在過去的一段時間里有幸接觸過某個項目,整體技術(shù)方案落后且線程濫用導(dǎo)致出現(xiàn)大量的內(nèi)存泄漏或者資源反復(fù)耗費。原因在于這個項目中對 RxJava 創(chuàng)建操作不規(guī)范,反復(fù)創(chuàng)建線程且不及時消耗導(dǎo)致,剛好朋友在使用我的 RxTask 開源項目中也給我反饋一件事,能否提供一個類似像協(xié)程作用域概念,當(dāng)被告知需要消耗時則及時把 RxTask 銷毀。故此針對 RxTask 進(jìn)行迭代升級有興趣的同學(xué)可以了解下 RxTask 的設(shè)計及實現(xiàn)理念

作用域的設(shè)想及機制

熟悉 RxTask 的同學(xué)們都知道在原有的 RxTask 設(shè)計理念并沒有存在 ITaskScope 這一概念,這一概念可以理解為限制當(dāng)前創(chuàng)建的 RxTask 存活在某一對象中,當(dāng)該對象被銷毀時通過 ITaskScope 實例接口及時告知 RxTask 進(jìn)行銷毀操作。避免 RxTask 還在運行,譬如在 Android 環(huán)境中 Activity 運行一個異步 RxTask 由于Activity 在某些場景被銷毀時,RxTask 來不及銷毀仍然繼續(xù)執(zhí)行最終執(zhí)行完成時回到 Activity 操作相關(guān) UI 此時,則會報出異常從而導(dǎo)致崩潰或 RxTask 持續(xù)運行中不斷消耗資源導(dǎo)致內(nèi)存一直抖動,當(dāng)然這都是因為開發(fā)者沒有及時的控制好RxTask 出現(xiàn)的問題。為此提出 ITaskScope 概念,通過實現(xiàn) ITaskScope 將 RxTask 與某個對象生命作用域進(jìn)行關(guān)聯(lián)從而及時進(jìn)行銷毀避免出現(xiàn)上訴問題。

接下來請看機制時序圖:

從機制圖中可以得到當(dāng) scope 處于銷毀動作時則會告知 Task 對象讓其取消執(zhí)行,最后釋放資源。

ITaskScope 的實現(xiàn)

那么 ITaskScope 接口定義如下

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

為什么在 ITaskScope 接口中會多出一個 ITaskScopeCallAction 接口呢?

其實同學(xué)可以這樣理解 ITaskScope 僅僅負(fù)責(zé)在某個對象中持有單個或多 RxTask 對象,該對象處于銷毀時期時及時調(diào)用 ITaskScope.scopeOnDestory() 方法去告知被持有 RxTask 對象們及時銷毀,此刻為了避免 ITaskScope 對象會直接操作或聯(lián)系 RxTask 對象那么,通過 ITaskScopeCallAction 去進(jìn)行告知相關(guān) RxTask 進(jìn)行相應(yīng)操作。

那么 ITaskScopeCallAction 僅僅負(fù)責(zé)處理銷毀操作回調(diào)事件即可。

同學(xué)們還記得 RxTask 奠基石接口 ITask 嗎?沒錯既然我們把 ITaskScope 、ITaskScopeCallAction 聲明了那么,我們則需要利用 ITask 接口聲明ITaskScope 綁定關(guān)系。

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

接下來再 RxTask 核心基類中實現(xiàn)關(guān)聯(lián)關(guān)系即可:

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 庫的同學(xué)們,都會清晰知道 RxTask 分為 libRxTasklibRxTaskAndroidExpand :

libRxTask 作為 RxTask 基準(zhǔn)及核心實現(xiàn)并支持后端直接使用。

libRxTaskAndroidExpand 作為對 Android 平臺進(jìn)行拓展簡單延伸的封裝。

那么在 libRxTaskAndroidExpand 庫中我們可以結(jié)合 Lifecycle 實現(xiàn)一個簡單封裝的 Scope 對象給同學(xué)們使用。

詳細(xì)實現(xiàn)如下:

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

總結(jié)

寫出一個庫其實不難,難點在于如何理解通用性、簡易性、拓展性、維護性,更重要的是需要虛心接受各方建議及反饋并進(jìn)行修改,持續(xù)更新改進(jìn)

以上就是協(xié)程作用域概念迭代RxTask 實現(xiàn)自主控制的詳細(xì)內(nèi)容,更多關(guān)于RxTask 自主控制的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android應(yīng)用關(guān)閉的情況以及識別方法詳解

    Android應(yīng)用關(guān)閉的情況以及識別方法詳解

    對于現(xiàn)在的安卓手機而言,很多功能都是在逐步完善的,這篇文章主要給大家介紹了關(guān)于Android應(yīng)用關(guān)閉的情況以及識別的相關(guān)資料,文章通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Android Flutter實現(xiàn)原理淺析

    Android Flutter實現(xiàn)原理淺析

    這篇文章主要介紹了Android Flutter的實現(xiàn)原理是怎么樣的,flutter可以說是當(dāng)下最流行的跨平臺技術(shù)了,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 詳細(xì)介紹Android中的視圖焦點Focus的使用

    詳細(xì)介紹Android中的視圖焦點Focus的使用

    本篇文章主要介紹了詳細(xì)介紹Android中的視圖焦點Focus的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Android實現(xiàn)EditText換行自動縮進(jìn)功能

    Android實現(xiàn)EditText換行自動縮進(jìn)功能

    在很多需要輸入多行文本的應(yīng)用(如記事本、編程代碼編輯器、博客編輯器等)中,自動縮進(jìn)功能能大大提升用戶的編輯效率與體驗,本文給大家介紹了Android實現(xiàn)EditText換行自動縮進(jìn)功能,下面提供整合后的完整代碼示例,需要的朋友可以參考下
    2025-04-04
  • Android使用CountDownTimer模擬短信驗證倒計時

    Android使用CountDownTimer模擬短信驗證倒計時

    這篇文章主要為大家詳細(xì)介紹了Android使用CountDownTimer模擬短信驗證倒計時,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android實現(xiàn)獲取聯(lián)系人電話號碼功能

    Android實現(xiàn)獲取聯(lián)系人電話號碼功能

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)獲取聯(lián)系人電話號碼功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android開發(fā)微信小程序頁面的圖文教程

    Android開發(fā)微信小程序頁面的圖文教程

    這篇文章主要介紹了Android開發(fā)微信小程序頁面的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Android編程開發(fā)之ScrollView嵌套GridView的方法

    Android編程開發(fā)之ScrollView嵌套GridView的方法

    這篇文章主要介紹了Android編程開發(fā)之ScrollView嵌套GridView的方法,結(jié)合實例分析了ScrollView嵌套GridView的相關(guān)注意事項與處理技巧,需要的朋友可以參考下
    2015-12-12
  • android銀行卡號驗證算法詳解

    android銀行卡號驗證算法詳解

    這篇文章主要介紹了android銀行卡號的驗證算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Android如何使用Glide加載清晰長圖

    Android如何使用Glide加載清晰長圖

    這篇文章主要介紹了Android如何使用Glide加載清晰長圖,幫助大家更好的理解和而學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下
    2021-03-03

最新評論

金堂县| 云南省| 富阳市| 南京市| 萍乡市| 太原市| 峨眉山市| 聊城市| 涿鹿县| 开平市| 界首市| 安塞县| 那坡县| 海门市| 桂平市| 鹿邑县| 留坝县| 新晃| 洛扎县| 侯马市| 灵宝市| 自贡市| 昌都县| 青河县| 屯昌县| 德江县| 马公市| 资讯 | 剑川县| 肥城市| 泰和县| 怀宁县| 溧阳市| 阳曲县| 舟曲县| 斗六市| 周至县| 常德市| 始兴县| 富裕县| 城市|