didi / DRouter

Android Router Framework
Apache License 2.0
743 stars 93 forks source link

统一处理页面跳转失败;拦截器中断路由后重新启动一个路由 #23

Closed suzhonxia closed 2 years ago

suzhonxia commented 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()
//        }
    }
}
qzcsfchh commented 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();
    }

}
qzcsfchh commented 2 years ago

关于跳转失败的类似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();
}
weigao123 commented 2 years ago

关于跳转失败的类似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接口来接收结果