Skip to content

RouterComponent 详解

Wiki edited this page Sep 8, 2019 · 2 revisions

RouterComponent 是下沉接口式的组件间服务组件,需要将接口放到BaseModule中,然后不同的业务在不同的Module写实现类,如果是调用比较频繁的组件建议使用。

  1. 支持获取Fragment。
  2. 支持带参数构造器。
  3. 支持通过自动构造器获取服务实例。
  4. 支持通过URL获取服务实例。
  5. 支持服务服务降级。

在 BaseModule 增加接口

interface UserService {
    fun getUser(uid: Int): User?
}

在 Module 中编写实现类,然后点击顶部菜单 BuildMake Module XXX 就在 GComponentCenter 中生成构造器方法。

@RouterComponent(value = UserService::class, path = "userService")
class UserServiceImpl : UserService {
    constructor() {}
  	@RouterComponentConstructor
    constructor(context: Context) {}
    override fun getUser(uid: Int): User? {
        return null
    }
}

调用

// 不推荐
val userService = GRouter.getInstance().getComponent("userService") as UserService
// 不推荐
val userService = GRouter.getInstance().getComponent("userService",UserService::class.java)
// 推荐
val userService = GComponentCenter.UserServiceImpl()

val user = userService.getUser(1)

服务降级

主动降级

可用使用Mockito实现mock服务

@RouterInterceptor
class DebugMockIntercepter : GRouterInterceptor() {
    override fun process(request: ComponentRequest): Boolean {
        if (request.protocol == UserService::class.java) {
            val userService = Mockito.mock(UserService::class.java)
            Mockito.`when`(userService.getUser(1)).thenReturn(User(1, "Mockito"))
            request.onContinue(userService)
            return true
        } else if (request.protocol == AccountService::class.java) {
            val accountService = Mockito.mock(AccountService::class.java)
            Mockito.`when`(accountService.getLoginUser()).thenReturn(User(101, "Mockito"))
            request.onContinue(accountService)
            return true
        }
        return super.process(request)
    }
}
被动降级

当跳转发生了错误的时候处理,可用用于提高APP的可用性,也可以用于实现单Module运行调试。

class DebugMockIntercepter : GRouterInterceptor() {
    override fun onError(request: ComponentRequest, exception: Exception): Boolean {
        if (request.protocol == UserService::class.java){
            val userService:UserService = Mockito.mock(UserService::class.java)
            Mockito.`when`(userService.getUser(1)).thenReturn(User(1,"Mockito"))
            request.onContinue(userService)
            return true
        }
        return super.onError(request, exception)
    }
}

使用

// 手动注册拦截器
GRouter.getInstance().addInterceptor(DebugMockInterceptor())
val userService = GComponentCenter.UserServiceImpl()
val user = userService.getUser(1)
Log.e("getUser", JSON.toJSONString(user))
// getUser: {"name":"Mockito","uid":1}
由于使用到Mockito做测试,所以需要引入Mockito
dependencies {
    api 'org.mockito:mockito-android:3.0.0'
}

在Application调用

System.setProperty("org.mockito.android.target",getDir("target", Context.MODE_PRIVATE).absolutePath)