EasyAndroid基礎集成組件庫之:EasyActivityResult 拒絕臃腫的onActivityResult代碼

什麼是EasyActivityResult

EasyActivityResult是開源基礎組件集成庫EasyAndroid中的基礎組件之一。其做用是:解決onActivityResult業務邏輯臃腫的問題java

EasyAndroid做爲一款集成組件庫,此庫中所集成的組件,均包含如下特色,你能夠放心使用~~android

  1. 精簡: 做爲一款集成庫,我不但願有那種大組件,儘可能控制好集成庫的大小。不要有冗餘代碼
  2. 內聚: 儘可能減小甚至避免單一組件對別的模塊進行依賴。作到組件間獨立。

得益於編碼時的高內聚性,若你只須要使用EasyActivityResult. 那麼能夠直接去copy EasyActivityResult源碼文件到你的項目中,直接進行使用,也是沒問題的。git

Activity數據回傳業務遇到的問題

在平時的開發中,咱們須要頁面進行數據回傳時,都是經過startActivityForResult啓動,而後在onActivityResult方法到處理各自的業務邏輯。好比圖片拍照,好比地址選擇等。github

這樣的作法,卻算不上優雅,並且隨着業務的持續迭代等緣由,onActivityResult方法也會容易失控,變得愈來愈臃腫,變得愈來愈難以維護。出現一堆的if-else if語句塊。bash

而分析一下這種數據回傳業務的使用場景:需求應該是每一個不一樣的startActivityForResult的啓動分支。都對應於一個onActivityResult的回傳判斷分支。它們是一一對應的關係。ide

也就是說,若是咱們能方便的onActivityResult處,將回傳數據正確的派發到對應的startActivityForResult分支處,作到誰發起的就交給誰本身處理。這種業務場景就完美了。測試

而EasyActivityResult組件便是專門用來幹這種事的!this

特性

  1. 接管onActivityResult方法,解耦數據回傳邏輯
  2. 在須要時,自動建立requestCode提供使用,免去每次都須要定義不重複的requestCode步驟
  3. 防暴擊:兩次啓動間隔必須大於1秒。

用法

  1. 首先,在基類的onActivityResult方法中添加中轉方法:
class BaseActivity:Activity() {
	override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
	    // 進行回傳數據過濾轉發
	    EasyActivityResult.dispatch(this, requestCode, resultCode, data)
	}
}
複製代碼
  1. 最後,使用EasyActivityResult.start()方法進行啓動便可:
EasyActivityResult.startActivity(
		context, 
		intent, 
		{result:Int, data:Intent -> // 數據回調接口
			// TODO 
			// result:對應回傳的resultCode
			// data:  對應回傳的intent數據
		})
複製代碼

使用方式就是這麼簡單!並且細心點的能夠發現:**根本不用再配置requestCode了!**又省了一步操做。美滋滋~~編碼

不用配置requestCode的緣由是: 在組件內部。當你配置有數據回調接口,那麼就會自動生成一個隨機的requestCode提供使用:spa

if (context !is Activity || callback == null) {
	context.startActivity(intent)
} else {
	val requestCode = codeGenerator.nextInt(0x0000FFFF)
	...
}
複製代碼

並且,因爲咱們也接管了啓動入口。因此也能很方便的進行防暴擊過濾:

如下方的模擬暴擊點擊爲例:

@OnClick(R.id.violentStart)
fun violentStart() {
    // 暴擊啓動測試:同時被調用啓動屢次,應只有第一次啓動成功
    EasyActivityResult.startActivity(this,
            Intent(this, EasyToastActivity::class.java),
            {_, _ -> EasyToast.DEFAULT.show("暴擊啓動測試:第一次啓動任務 接收返回信息") })

    EasyActivityResult.startActivity(this,
            Intent(this, EasyToastActivity::class.java),
            {_, _ -> EasyToast.DEFAULT.show("暴擊啓動測試:第二次啓動任務 接收返回信息") })

    EasyActivityResult.startActivity(this,
            Intent(this, EasyToastActivity::class.java),
            {_, _ -> EasyToast.DEFAULT.show("暴擊啓動測試:第三次啓動任務 接收返回信息") })
}
複製代碼

頁面效果展現:

相關文章
相關標籤/搜索