kotlin協(xié)程實戰(zhàn):用協(xié)程實現(xiàn)動態(tài)權限請求

自從6.0加入動態(tài)權限之后拭抬,很多地方都要用到苍狰,開始的時候使用的原生代碼寫權限請求闪水,代碼格式如:

if(應用是否已經(jīng)請求了該權限組){
    權限請求后的代碼
}else{
    請求權限
}

然后不知道在fragment或是activity里面重寫

override onRequestPermissionsResult{
    if(請求成功){
        權限請求后的代碼
    }else{
        失敗處理
    }
}

不知道你們對這種代碼是什么感覺午衰,反正我是很不喜歡這樣的代碼淘捡,和不喜歡startActivityForResult還有handle一樣嘿辟,由于今年來rxjava大火舆瘪,我首先想到的是能不能用rxjava來封裝片效,果然,git上一搜英古,就搜到RxPermissionsRxStartActivityForResult這兩個項目淀衣,這種寫法優(yōu)化了原生代碼那種離散的寫法,增加了代碼的可讀性召调,代碼變?yōu)?/p>

new RxPermissions(activity)
    .request(權限數(shù)組)
    .subscribe(){
        if(權限請求成功){
        {
    }

瞬間簡潔了不少膨桥,不過考慮到我的很多項目都接入了協(xié)程,也覺得協(xié)程的順序?qū)懛勺x性簡潔性和可維護性都更強唠叛,希望能夠找到請求權限的協(xié)程解決方案只嚣,在網(wǎng)上找了很久也沒找到相關方案,找startActivityForResult的時候卻找到了startActivityForResult的協(xié)程解決方案InlineActivityResult艺沼,于是參考了他的設計思想册舞,最終實現(xiàn)了動態(tài)權限請求的協(xié)程寫法,用kotlin協(xié)程實現(xiàn)動態(tài)權限請求

用法很簡單:

CoroutineScope(Dispatchers.Main).launch {
    try {
        requestPermissionForResult(*permissions)//權限請求
        權限請求成功后執(zhí)行的代碼
    }catch (e: InlineRequestPermissionException) {
        權限請求失敗后執(zhí)行的代碼
    }
}

因為語法要求障般,所以在執(zhí)行權限請求前要先開啟一個協(xié)程CoroutineScope(Dispatchers.Main).launch调鲸,因為是在Activity或是fragment中請求,所以最好在協(xié)程中指定主線程Dispatchers.Main

trycatch是因為要處理權限取消或是權限請求失敗后的流程挽荡,也可以在設計的時候集中處理權限請求失敗后的流程藐石,這樣就可以不用寫trycatch,這就涉及到協(xié)程的異常處理了

CoroutineScope(Dispatchers.Main).launch {
    requestPermissionForResult(*permissions)//權限請求
    權限請求成功后執(zhí)行的代碼
}

另外trycatch也可以和其他協(xié)程共用,這樣trycatch就不是專門為某個協(xié)程而生了

CoroutineScope(Dispatchers.Main).launch {
    try {
        requestPermissionForResult(*permissions)//權限請求協(xié)程寫法
        權限請求成功后執(zhí)行的代碼
        val result=startForResult(activity)//startActivityForResult協(xié)程寫法
        startActivityForResult返回代碼
    }catch (e: InlineRequestPermissionException) {
        權限請求失敗后執(zhí)行的代碼
    }catch(e: InlineRequestPermissionException){
        startActivityForResult返回異常處理
    }
}

實現(xiàn)原理也不復雜徐伐,思路是請求權限的時候在Activity中創(chuàng)建一個無界面fragment,提交fragment事務的時候不要提交到回退棧(commitNowAllowingStateLoss)贯钩,在該fragment中重寫onRequestPermissionsResult方法接收請求結(jié)果,完畢之后移除fragment事務,然后用協(xié)程封裝方法封裝办素;這樣做的好處是整個權限請求過程和原請求的Activity/Fragment解耦角雷,無需關心請求過程,也無需重寫onRequestPermissionsResult去接收請求

無界面fragment提交事務方式:

activity.supportFragmentManager
        .beginTransction()
        .add(fragment,Tag)
        .commitNowAllowingStateLoss()

無界面fragment移除

fragmentManager.beginTransaction().remove(this).commitAllowingStateLoss()

最后用協(xié)程封裝


image.png

當然原理還是比較簡單性穿,實現(xiàn)過程也不算復雜勺三,這是項目地址:用kotlin協(xié)程實現(xiàn)動態(tài)權限請求

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市需曾,隨后出現(xiàn)的幾起案子吗坚,更是在濱河造成了極大的恐慌,老刑警劉巖呆万,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件商源,死亡現(xiàn)場離奇詭異,居然都是意外死亡谋减,警方通過查閱死者的電腦和手機牡彻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來出爹,“玉大人庄吼,你說我怎么就攤上這事缎除。” “怎么了总寻?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵器罐,是天一觀的道長。 經(jīng)常有香客問我渐行,道長轰坊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任殊轴,我火速辦了婚禮衰倦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旁理。我一直安慰自己樊零,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布孽文。 她就那樣靜靜地躺著驻襟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芋哭。 梳的紋絲不亂的頭發(fā)上沉衣,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音减牺,去河邊找鬼豌习。 笑死,一個胖子當著我的面吹牛拔疚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稚失,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼栋艳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了句各?” 一聲冷哼從身側(cè)響起吸占,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凿宾,沒想到半個月后矾屯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡初厚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年件蚕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡骤坐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出下愈,到底是詐尸還是另有隱情纽绍,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布势似,位于F島的核電站拌夏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏履因。R本人自食惡果不足惜障簿,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栅迄。 院中可真熱鬧站故,春花似錦、人聲如沸毅舆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憋活。三九已至岂津,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悦即,已是汗流浹背吮成。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辜梳,地道東北人粱甫。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像冗美,于是被迫代替她去往敵國和親魔种。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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