Activity-onActivityForResult業(yè)務(wù)解耦(1)

業(yè)務(wù)處理現(xiàn)狀

Activity需要跟多個(gè)頁(yè)面組件交互處理結(jié)果,代碼可能就會(huì)變成這樣,A到K 11個(gè)分支處理。如果分支還有嵌套分支,那么代碼的閱讀成本、維護(hù)成本就會(huì)成倍增加。

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            CODE_A -> {
            }
            CODE_B -> {
            }
            CODE_C -> {
            }
            CODE_D -> {
            }
            CODE_E -> {
            }
            CODE_F -> {
            }
            CODE_G -> {
            }
            CODE_H -> {
            }
            CODE_I -> {
            }
            CODE_J -> {
            }
            CODE_K -> {
            }
        }
    }
痛點(diǎn)
1.閱讀成本高

以上代碼是從實(shí)際項(xiàng)目中抽取處理的,經(jīng)過(guò)了刪減勉勉強(qiáng)強(qiáng)還是可讀的。但實(shí)際情況是,分支嵌套分支,代碼一屏無(wú)法展示完,相當(dāng)難受了。

2.維護(hù)成本高

所有業(yè)務(wù)分支處理都堆在一起,其中一個(gè)業(yè)務(wù)需要修改,就得把其他業(yè)務(wù)分支也過(guò)一邊,以免其受到影響。原本只需要修改A業(yè)務(wù),其他B\C\E業(yè)務(wù)我都得過(guò)一邊,維護(hù)成本直線往上升了。

如何解決?
方案1:函數(shù)封裝業(yè)務(wù)

一個(gè)函數(shù)對(duì)應(yīng)一種業(yè)務(wù)處理,在分支比較少的情況下,還是比較適合的,但分支過(guò)多,就不太適應(yīng),因?yàn)榇a無(wú)論如何轉(zhuǎn)移都是在Activity中,勢(shì)必會(huì)造成其不斷地膨脹。

方案2:類封裝業(yè)務(wù)

一個(gè)類對(duì)應(yīng)一種業(yè)務(wù)處理,其中一種業(yè)務(wù)發(fā)生變化,不會(huì)影響其他業(yè)務(wù),適合業(yè)務(wù)分支較多、業(yè)務(wù)處理較復(fù)雜的情況。

以下會(huì)基于類封裝業(yè)務(wù)來(lái)解決,具體方案
1.定義ResultHandler 接口,描述業(yè)務(wù)處理的統(tǒng)一入口,每種業(yè)務(wù)處理都要實(shí)現(xiàn)它。
interface ResultHandler {
    abstract fun onResult(intentData: Intent?)
}
2.定義結(jié)果分發(fā)器ResultDispatcher ,根據(jù)requestCode來(lái)分發(fā)。
object ResultDispatcher {

    private const val CODE_A = 1
    private const val CODE_B = 2

    private val handlers = mutableMapOf<Int, ResultHandler>().apply {//1
        put(CODE_A, AResultHandler())
        put(CODE_B, BResultHandler())
    }

    fun dispatch(requestCode: Int, intentData: Intent?) {//2
        handlers[requestCode]?.onResult(intentData)
    }
}

注釋1:維護(hù)requestCode和ResultHandler的對(duì)應(yīng)關(guān)系,一對(duì)一;
注釋2:根據(jù)requestCode查找對(duì)應(yīng)的ResultHandler來(lái)處理也出;

3.各業(yè)務(wù)處理器的實(shí)現(xiàn)
//A業(yè)務(wù)處理
class AResultHandler : ResultHandler {
    override fun onResult(intentData: Intent?) {
        //do something
    }
}

//B業(yè)務(wù)處理
class BResultHandler : ResultHandler {
    override fun onResult(intentData: Intent?) {
        //do something
    }
}
4.調(diào)用處
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        ResultDispatcher.dispatch(requestCode, data)
    }

以上分析有不對(duì)的地方,請(qǐng)指出,互相學(xué)習(xí),謝謝哦!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容