Android中组件间通信解耦的实现方案

在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所依赖的库

//此处使用了Kotlin,需要在gradle中添加
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'

//AutoService所需要依赖的库
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容器中,在运行时通过路由或接口去查找对应的实现类,从而实现模块间解耦通信。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值