EasyAndroid基礎整合元件庫之:EasyActivityResult 拒絕臃腫的onActivityResult程式碼

Haoge發表於2018-06-14

什麼是EasyActivityResult

EasyActivityResult是開源基礎元件整合庫EasyAndroid中的基礎元件之一。其作用是:解決onActivityResult業務邏輯臃腫的問題

EasyAndroid作為一款整合元件庫,此庫中所整合的元件,均包含以下特點,你可以放心使用~~

  1. 精簡: 作為一款整合庫,我不希望有那種大元件,儘量控制好整合庫的大小。不要有冗餘程式碼
  2. 內聚: 儘量減少甚至避免單一元件對別的模組進行依賴。做到元件間獨立。

得益於編碼時的高內聚性,若你只需要使用EasyActivityResult. 那麼可以直接去copy EasyActivityResult原始碼檔案到你的專案中,直接進行使用,也是沒問題的。

Activity資料回傳業務遇到的問題

在平時的開發中,我們需要頁面進行資料回傳時,都是通過startActivityForResult啟動,然後在onActivityResult方法處處理各自的業務邏輯。比如圖片拍照,比如地址選擇等。

這樣的做法,卻算不上優雅,而且隨著業務的持續迭代等原因,onActivityResult方法也會容易失控,變得越來越臃腫,變得越來越難以維護。出現一堆的if-else if語句塊。

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

也就是說,如果我們能方便的onActivityResult處,將回傳資料正確的派發到對應的startActivityForResult分支處,做到誰發起的就交給誰自己處理。這種業務場景就完美了。

而EasyActivityResult元件即是專門用來幹這種事的!

特性

  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提供使用:

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("暴擊啟動測試:第三次啟動任務 接收返回資訊") })
}
複製程式碼

頁面效果展示:

EasyAndroid基礎整合元件庫之:EasyActivityResult 拒絕臃腫的onActivityResult程式碼

相關文章