Closed suzhonxia closed 2 years ago
这两种场景下的逻辑处理帮忙看看有没有什么问题或更好的封装。
统一处理页面跳转失败逻辑:
private fun start(uri: String, extras: Map<String, Any>? = null, intent: Intent? = null, context: Context? = null, callback: RouterCallback? = null) { DRouter.build(uri) .putExtraMap(extras) .putExtra(Extend.START_ACTIVITY_VIA_INTENT, intent) .start(context, object : RouterCallback.ActivityCallback() { override fun onResult(result: Result) { if (result.request.routerType == RouterType.UNDEFINED || result.request.routerType == RouterType.ACTIVITY) { if (!result.isActivityStarted) { // LogUtils.d(TAG, "RouteHelper startLocalRoute 打开了错误的地址 uri = ${result.request.uri}, type = ${result.request.routerType}") // 统一处理页面打开失败逻辑。。。 return } } callback?.onResult(result) } override fun onActivityResult(resultCode: Int, data: Intent?) { (callback as? RouterCallback.ActivityCallback)?.onActivityResult(resultCode, data) } }) }
拦截器中断路由后打开另一个页面:
@Interceptor(name = "RouteInterceptor", priority = 999, global = true) class RouteInterceptor : IRouterInterceptor { override fun handle(request: Request) { if (request.routerType == RouterType.ACTIVITY) {// 判断路由类型 if (request.uri.toString().contains(RouteConstant.ROUTE_OPTION)) {// 判断是否是需要前置条件的uri if (SPUtils.getInstance().getBoolean("optionFlag")) {// 模拟前置条件 request.interceptor.onContinue() } else { RouteHelper.startLocalRoute(RouteConstant.ROUTE_TEST)// 重新打开一个页面 } } else { request.interceptor.onContinue() } } else { request.interceptor.onContinue() } // if (request.uri.toString() == RouteConstant.ROUTE_TEST) { // request.interceptor.onContinue() // } else { // request.interceptor.onInterrupt() // } } }
不是有全局拦截器吗?
@Interceptor(priority = 1, global = true)
public class GlobalInterceptor implements IRouterInterceptor {
private static final String TAG = "GlobalInterceptor";
public GlobalInterceptor() {
RouterLogger.getAppLogger().d("GlobalInterceptor create");
}
@Override
public void handle(@NonNull final Request request) {
if (request.getRouterType() == RouterType.ACTIVITY) {
boolean redirect = request.getUri().toString().startsWith("/activity/Test1_");
if (redirect) {
DRouter.build("/activity/test3").start(request.getContext());
request.getInterceptor().onInterrupt();
} else {
request.getInterceptor().onContinue();
}
return;
}
request.getInterceptor().onContinue();
}
}
关于跳转失败的类似404的页面,确实可以加一个配置,比如在这里:
/**
* Created by gaowei on 2018/9/3
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface Interceptor {
String name() default "";
// from large to small
int priority() default 0;
boolean global() default false;
@Extend.Cache int cache() default Extend.Cache.NO;
// fallback url for failed navigation.
String fallback();
}
关于跳转失败的类似404的页面,确实可以加一个配置,比如在这里:
/** * Created by gaowei on 2018/9/3 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.CLASS) public @interface Interceptor { String name() default ""; // from large to small int priority() default 0; boolean global() default false; @Extend.Cache int cache() default Extend.Cache.NO; // fallback url for failed navigation. String fallback(); }
2.3.0版本 增加,可以在全局拦截器里重定向 增加,全局请求结果监听,可以实现IRouterResult接口来接收结果
这两种场景下的逻辑处理帮忙看看有没有什么问题或更好的封装。
统一处理页面跳转失败逻辑:
拦截器中断路由后打开另一个页面: