-
Notifications
You must be signed in to change notification settings - Fork 69
RouterComponent 详解
Wiki edited this page Sep 8, 2019
·
2 revisions
RouterComponent 是下沉接口式的组件间服务组件,需要将接口放到BaseModule中,然后不同的业务在不同的Module写实现类,如果是调用比较频繁的组件建议使用。
- 支持获取Fragment。
- 支持带参数构造器。
- 支持通过自动构造器获取服务实例。
- 支持通过URL获取服务实例。
- 支持服务服务降级。
在 BaseModule 增加接口
interface UserService {
fun getUser(uid: Int): User?
}
在 Module 中编写实现类,然后点击顶部菜单 Build
的 Make 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}
dependencies {
api 'org.mockito:mockito-android:3.0.0'
}
在Application调用
System.setProperty("org.mockito.android.target",getDir("target", Context.MODE_PRIVATE).absolutePath)