ProxyFactory 基于RxJava封裝的異步任務(wù)代理框架

ProxyFactory的主要用途是為了簡(jiǎn)化異步任務(wù)蜡峰。可以快速酌儒、方便的使用其開(kāi)發(fā)異步相關(guān)的業(yè)務(wù)需求。
首先放上Github倉(cāng)庫(kù)地址如果你覺(jué)得喜歡或有用勺疼,還請(qǐng)一鍵三連教寂,感謝捏鱼。

下載

第一步:添加 JitPack 倉(cāng)庫(kù)到你項(xiàng)目根目錄的 gradle 文件中。
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
第二步:添加這個(gè)依賴(lài)酪耕。
dependencies {
    implementation "com.github.kelinZhou:ProxyFactory:${LastVersion}"
}

使用

在使用之前需要先對(duì)其進(jìn)行初始化导梆。

ProxyFactory.init(application, ToasterImpl())

class ToasterImpl : Toaster {
    /**
     * 處理異步任務(wù)中捕獲的異常,如果你希望自己處理改異常則需要返回null迂烁,返回null之后Proxy的onFailed方法將不會(huì)被回調(diào)看尼,否則會(huì)將你返回的ApiException回調(diào)給Proxy的onFailed方法。
     */
    override fun handError(e: Throwable): ApiException {
        return e as? ApiException ?: ApiException(-10, e.message)
    }

    /**
     * 顯示調(diào)用異步任務(wù)失敗時(shí)的提示盟步。
     */
    override fun showFailedToast(e: ApiException) {
        Toast.makeText(applicationContext, e.displayMessage, Toast.LENGTH_LONG).show()
    }

    /**
     * 顯示加載中的樣式藏斩。
     */
    override fun showProgress(context: Context, progressTip: String?) {
        showProgressDialog(context, progressTip)
    }

    /**
     * 隱藏加載中的樣式。
     */
    override fun hideProgress(context: Context) {
        dismissProgressDialog(context)
    }
}

Proxy

ProxyFactory提供了以下幾類(lèi)的Proxy用于處理不同業(yè)務(wù)場(chǎng)景却盘。

1. DataProxy 只關(guān)心返回?cái)?shù)據(jù)的代理狰域。

使用DataProxy您可以方便的執(zhí)行異步任務(wù)。

ProxyFactory.createProxy { Observable.just("I'm Result!") }
    .onSuccess { data ->
        // Do something with data.
    }
    .onFailed { e ->
        // Do something with Exception.
    }
    .request()  //請(qǐng)求啟動(dòng)任務(wù)黄橘。

2.ActionDataProxy 帶有動(dòng)作的代理兆览。

使用ActionDataProxy您可以方便的執(zhí)行異步任務(wù)并關(guān)系其動(dòng)作。

ProxyFactory.createActionProxy { Observable.just("I'm Result for.") }
    .onSuccess { data, action ->
        // Do something with data & action.
    }
    .onFailed { e, action ->
        // Do something with data & action.
    }
    .request(LoadAction.LOAD)

不同于DataProxy塞关,ActionDataProxy必須在發(fā)起請(qǐng)求時(shí)傳入動(dòng)作(action)LoadActionActionParameter抬探,然后可以在回調(diào)中獲取到action。

3.IdDataProxy 支持請(qǐng)求參數(shù)的代理帆赢。

使用IdDataProxy您可以方便的執(zhí)行異步任務(wù)并傳遞參數(shù)小压。

ProxyFactory.createIdProxy<String, String> { id -> Observable.just("I'm Result for $id.") }
    .onSuccess { id, data -> 
        // Do something with data & id.
    }
    .onFailed { id, e -> 
        // Do something with Exception & id.
    }
    .request("Kelin")

不同于DataProxyIdDataProxy可以在回調(diào)中獲取到發(fā)起任務(wù)時(shí)傳入的參數(shù)椰于。

4.IdActionDataProxy 同時(shí)支持請(qǐng)求參和動(dòng)作的代理怠益。

ProxyFactory.createIdActionProxy<String, String> { id -> Observable.just("I'm Result for $id.") }
    .bind(this, object :IdActionDataProxy.IdActionDataCallback<String, ActionParameter, String>{
        override fun onSuccess(id: String, action: ActionParameter, data: String) {
            // Do something with data & id & action.
        }

        override fun onFailed(id: String, action: ActionParameter, e: ApiException) {
            // Do something with data & id & action.
        }
    })
    .request(ActionParameter.createInstance(), "Kelin")

需要注意的是IdActionDataProxy不再支持onSuccessonFailed的方式設(shè)置回調(diào)。

ActionParameter

動(dòng)作及功能參數(shù)廉羔,ActionParameter的核心就是LoadAction溉痢。而LoadAction是一個(gè)枚舉類(lèi),主要成員如下:

  • LOAD :沒(méi)有數(shù)據(jù)load憋他。對(duì)于分頁(yè)的孩饼,load總是第一頁(yè)的數(shù)據(jù)。
  • RETRY :load失敗竹挡,retry(這個(gè)不叫refresh6迫ⅰ!>竞薄L萋搿)宝泵。對(duì)于分頁(yè)的,load總是第一頁(yè)的數(shù)據(jù)轩娶。
  • REFRESH : 已經(jīng)load成功儿奶,再次load。對(duì)于分頁(yè)的鳄抒,load總是第一頁(yè)的數(shù)據(jù)闯捎。
  • AUTO_REFRESH : 已經(jīng)load成功,再次load许溅。對(duì)于分頁(yè)的瓤鼻,load總是已經(jīng)加載過(guò)的所有頁(yè)。
  • LOAD_MORE : 加載更多(分頁(yè)加載)贤重。

說(shuō)到分頁(yè)ActionParameter還有個(gè)子類(lèi)PageActionParameter茬祷,PageActionParameter可以用來(lái)處理分頁(yè)邏輯。

如果要使用分頁(yè)加載則需要用到ProxyFactorycreatePageActionProxy方法或createPageIdActionProxy方法并蝗,下面以createPageIdActionProxy方法舉例:

ProxyFactory.createPageIdActionProxy<String, String> { id, pages ->  Observable.just("I'm Result for $id. Pages(page:${pages.page}, size:${pages.size}).") }
    .bind(this, object :IdActionDataProxy.IdActionDataCallback<String, ActionParameter, String>{
        override fun onSuccess(id: String, action: ActionParameter, data: String) {
            // Do something with data & id & action.
        }

        override fun onFailed(id: String, action: ActionParameter, e: ApiException) {
            // Do something with data & id & action.
        }
    })
    .request(PageActionParameter.createInstance(true, 20), "Kelin")

上面的栗子中PageActionParameter.createInstance(true, 20)參數(shù)true表示啟用分頁(yè)加載祭犯,20表示每頁(yè)的數(shù)量。

注意事項(xiàng)

bind方法

所有的Proxy都是支持通過(guò)調(diào)用其bind方法為其綁定到生命周期組件LifecycleOwner的借卧,是為了防止頁(yè)面銷(xiāo)毀后任務(wù)沒(méi)有銷(xiāo)毀而回調(diào)又是內(nèi)部類(lèi)從而可能導(dǎo)致內(nèi)存泄露的問(wèn)題盹憎。
當(dāng)然,bind方法也不是強(qiáng)制要求調(diào)用的铐刘,沒(méi)有調(diào)用過(guò)bind方法的Proxy的回調(diào)均為一次性回調(diào)陪每,即無(wú)論是onSuccess還是onFailed被回調(diào)過(guò)一次后,回調(diào)就會(huì)立即從Proxy內(nèi)部被移除引用镰吵。也就意味著沒(méi)有調(diào)用過(guò)bind方法的Proxy不能被重復(fù)使用檩禾。

下面列舉一個(gè)Proxy使用不當(dāng)?shù)睦踝樱?/em>

val proxy = ProxyFactory.createProxy { Observable.just("I'm Result!") }
    .onSuccess { data ->
        // Do something with data.
    }
    .onFailed { e ->
        // Do something with Exception.
    }
btnTest.setOnClickListener{
    proxy.request()  //請(qǐng)求啟動(dòng)任務(wù)。
}

在這個(gè)栗子中疤祭,只有btnTest按鈕被第一次點(diǎn)擊的時(shí)候會(huì)執(zhí)行onSuccess還是onFailed回調(diào)盼产,而從第二次開(kāi)始以及之后的所有點(diǎn)擊都不會(huì)再執(zhí)行onSuccess還是onFailed回調(diào)了。

*如果想要重復(fù)使用一個(gè)Proxy則需要對(duì)上面的代碼進(jìn)行改造:

val proxy = ProxyFactory.createProxy { Observable.just("I'm Result!") }
    .bind(activity) //如果是在Activity中使用則直接傳入`this`勺馆,如果是在Fragment中使用則最好傳入`viewLifecycleOwner`戏售。
    .onSuccess { data ->
        // Do something with data.
    }
    .onFailed { e ->
        // Do something with Exception.
    }
btnTest.setOnClickListener{
    proxy.request()  //請(qǐng)求啟動(dòng)任務(wù)。
}

progress方法

所有Proxy都支持在調(diào)用request方法時(shí)自動(dòng)彈窗l(fā)oading對(duì)話(huà)框草穆。loading對(duì)話(huà)框的彈出和隱藏能力由Toaster接口中的showProgresshideProgress方法提供灌灾。
下面舉個(gè)栗子來(lái)演示progress方法的用法:

ProxyFactory.createProxy { Observable.just("I'm Result!") }
    .progress(context, "Please Wait...") //第一個(gè)參數(shù)為彈出對(duì)話(huà)框時(shí)所需要的上下文,第二個(gè)參數(shù)為loading對(duì)話(huà)框中需要顯示的文字悲柱。
    .onSuccess { data ->
        // Do something with data.
    }
    .onFailed { e ->
        // Do something with Exception.
    }
    .request()  //請(qǐng)求啟動(dòng)任務(wù)锋喜。

setNotToast方法

為了方便調(diào)用也為了回調(diào)更加靈活,所以onSuccess還是onFailed回調(diào)并不是都必須同時(shí)設(shè)置的,考慮到通常情況下onFailed回調(diào)只是為了提示用戶(hù)嘿般,所以如果沒(méi)有設(shè)置onFailed回調(diào)則默認(rèn)會(huì)彈出Toast提示用戶(hù)段标。彈出Toast的能力由Toaster接口中的showFailedToast方法提供。如果你不希望在失敗時(shí)彈出Toast提示也不想設(shè)置onFailed回調(diào)則可以使用該方法炉奴。
下面舉個(gè)栗子來(lái)演示setNotToast方法的用法:

ProxyFactory.createProxy { Observable.just("I'm Result!") }
    .setNotToast() //禁止在失敗時(shí)自動(dòng)彈出Toast逼庞。
    .onSuccess { data ->
        // Do something with data.
    }
    .request()  //請(qǐng)求啟動(dòng)任務(wù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盆佣,一起剝皮案震驚了整個(gè)濱河市往堡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌共耍,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吨瞎,死亡現(xiàn)場(chǎng)離奇詭異痹兜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)颤诀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)字旭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人崖叫,你說(shuō)我怎么就攤上這事遗淳。” “怎么了心傀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵屈暗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我脂男,道長(zhǎng)养叛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任宰翅,我火速辦了婚禮弃甥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汁讼。我一直安慰自己淆攻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布嘿架。 她就那樣靜靜地躺著瓶珊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪眶明。 梳的紋絲不亂的頭發(fā)上艰毒,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音搜囱,去河邊找鬼丑瞧。 笑死柑土,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绊汹。 我是一名探鬼主播稽屏,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼西乖!你這毒婦竟也來(lái)了狐榔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤获雕,失蹤者是張志新(化名)和其女友劉穎薄腻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體届案,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庵楷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了楣颠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尽纽。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖童漩,靈堂內(nèi)的尸體忽然破棺而出弄贿,到底是詐尸還是另有隱情,我是刑警寧澤矫膨,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布差凹,位于F島的核電站,受9級(jí)特大地震影響豆拨,放射性物質(zhì)發(fā)生泄漏直奋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一施禾、第九天 我趴在偏房一處隱蔽的房頂上張望脚线。 院中可真熱鬧,春花似錦弥搞、人聲如沸邮绿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)船逮。三九已至,卻和暖如春粤铭,著一層夾襖步出監(jiān)牢的瞬間挖胃,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酱鸭,地道東北人吗垮。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像凹髓,于是被迫代替她去往敵國(guó)和親烁登。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容