在android中进行组件间拆分时,经常会遇到组件间通信的场景,一般是使用接口与实现的方式,但该方式存在一定的耦合,可能出现互相依赖的场景,为了解决该问题,就需要使用到一些组件间间解耦的方案。
方案一,使用ARouter的IProvider
1)创建一个接口类并继承自ARouter中的IProvider
public interface Study extends IProvider {
void open();
}
2)新建一个Study接口的实现类,并添加ARouter的注解
@Route(path = "/app/study")
public class StudyImpl implements Study{
@Override
public void open() {
}
@Override
public void init(Context context) {
}
}
使用时,
ARouter.getInstance().navigation(Study.class).open();
在真实的项目开发中,接口类一般会下沉到BaseModule,而相应的实现类会上游到对应的Module中,以此实现模块间的解耦,使用时,直接拿到对应的路由地址就可以调用,使用简单方便,但ARouter已经停止维护了,且自身也存在一些Bug。因此接下来进入第二种解耦方案。
方案二,AutoService和ServiceLoader实现解耦
1)使用时,需要先引入AutoService所依赖的库
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
implementation 'com.google.auto.service:auto-service:1.0-rc7'
kapt 'com.google.auto.service:auto-service:1.0-rc7'
2)创建接口类
interface Study {
fun open()
fun close()
}
3)创建对应的实现类,并增加AutoService注解
import com.google.auto.service.AutoService
@AutoService(Study::class)
class StudyImpl : Study {
override fun open() {
println("open")
}
override fun close() {
println("close")
}
}
4)使用时通过ServiceLoader查找对应的实现类
val loader = ServiceLoader.load(Study::class.java)
loader.iterator().next().open()
想较于ARouter,AutoService使用起来更加稳定,且是谷歌官方的。 总结:如上两种方案都是在编译时根据接口,查找对应的实现类,并存放到一个Map容器中,在运行时通过路由或接口去查找对应的实现类,从而实现模块间解耦通信。
|