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("暴击启动测试:第三次启动任务 接收返回信息") })
}
复制代码

页面效果展现:

相关文章
相关标签/搜索