当前位置: 首页 > 工具软件 > ARouter > 使用案例 >

ARouter(二) ARouter类

华振
2023-12-01

ARouter类做了对_ARouter类的简单封装。从而使得内部接口方法不对外暴露, 对开发者也显的简单。

 

ARouter类包含以下功能,基本上也是ARouter框架的功能

  • 初始化
  1. 初始化的内容都在这个init方法里。自动生成类的对象生成,缓存到WareHouse对象中, 而afterInit()是初始化拦截器对象,也是缓存到WareHouse。具体逻辑参考前面那篇自动生成的类
  2. 这个方法最好在app启动时调用,也就是application的onCreated()方法。
    /**
     * Init, it must be call before used router.
     */
    public static void init(Application application) {
        if (!hasInit) {
            logger = _ARouter.logger;
            _ARouter.logger.info(Consts.TAG, "ARouter init start.");
            hasInit = _ARouter.init(application);

            if (hasInit) {
                _ARouter.afterInit();
            }

            _ARouter.logger.info(Consts.TAG, "ARouter init over.");
        }
    }
  • 打开调试
  1.  帮助你调试无法找到路由对象的问题。会跳出Toast.
  2. 可以在application的onCreated()方法里配置,和Gradle的Build Type绑定处理。这样开发调试时打开,正式发布时关闭, 不需要手动就改了。
    protected Object navigation(final Context context, final Postcard postcard, final int requestCode, final NavigationCallback callback) {
        try {
            LogisticsCenter.completion(postcard);
        } catch (NoRouteFoundException ex) {
            logger.warning(Consts.TAG, ex.getMessage());

            if (debuggable()) {
                // Show friendly tips for user.
                runInMainThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(mContext, "There's no route matched!\n" +
                                " Path = [" + postcard.getPath() + "]\n" +
                                " Group = [" + postcard.getGroup() + "]", Toast.LENGTH_LONG).show();
                    }
                });
            }

            if (null != callback) {
                callback.onLost(postcard);
            } else {    // No callback for this invoke, then we use the global degrade service.
                DegradeService degradeService = ARouter.getInstance().navigation(DegradeService.class);
                if (null != degradeService) {
                    degradeService.onLost(context, postcard);
                }
            }

            return null;
        }
  •  配置日志
  1. 打开/关闭,调试日志。
  2. 可以在application的onCreated()方法里配置,和Gradle的Build Type绑定处理。这样开发调试时打开,正式发布时关闭, 不需要手动就改了。
  3. 由于开放了日志接口,可以用静态代理模式,换成其他日志记录方式,比如Log4J等, 这样可以在用户设备端存储日志,做到反馈给开发者。
    public static void setLogger(ILogger userLogger) {
        _ARouter.setLogger(userLogger);
    }

    public interface ILogger {

    boolean isShowLog = false;
    boolean isShowStackTrace = false;
    String defaultTag = Consts.TAG;

    void showLog(boolean isShowLog);

    void showStackTrace(boolean isShowStackTrace);

    void debug(String tag, String message);

    void info(String tag, String message);

    void warning(String tag, String message);

    void error(String tag, String message);

    void monitor(String message);

    boolean isMonitorMode();

    String getDefaultTag();
}
  • 设置线程池
  1. 线程池在ARouter的作用,目前是为了初始化Interceptor,以及Interceptor的执行。
  2. 目前默认是:
public class DefaultPoolExecutor extends ThreadPoolExecutor {
    //    Thread args
    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
    private static final int INIT_THREAD_COUNT = CPU_COUNT + 1;
    private static final int MAX_THREAD_COUNT = INIT_THREAD_COUNT;
    private static final long SURPLUS_THREAD_LIFE = 30L;

    private static DefaultPoolExecutor instance;

    public static DefaultPoolExecutor getInstance() {
        if (null == instance) {
            synchronized (DefaultPoolExecutor.class) {
                if (null == instance) {
                    instance = new DefaultPoolExecutor(
                            INIT_THREAD_COUNT,
                            MAX_THREAD_COUNT,
                            SURPLUS_THREAD_LIFE,
                            TimeUnit.SECONDS,
                            new ArrayBlockingQueue<Runnable>(64),
                            new DefaultThreadFactory());
                }
            }
        }
        return instance;
    }
  • 创建Postcard
  1. Postcard含有跳转的所有信息。
  2. 三个build()方法都是为了创建Postcard.

    /**
     * Build the roadmap, draw a postcard.
     *
     * @param path Where you go.
     */
    public Postcard build(String path) {
        return _ARouter.getInstance().build(path);
    }

    /**
     * Build the roadmap, draw a postcard.
     *
     * @param path  Where you go.
     * @param group The group of path.
     */
    @Deprecated
    public Postcard build(String path, String group) {
        return _ARouter.getInstance().build(path, group);
    }

    /**
     * Build the roadmap, draw a postcard.
     *
     * @param url the path
     */
    public Postcard build(Uri url) {
        return _ARouter.getInstance().build(url);
    }
  •  获取接口服务(Provider), FRAGMENT的对象实例
  1. 两个Navigation()方法中,有一个方法可以获取Provider服务对象。Provider对象是别的组件对外暴露的接口实例。
  2. 也可以获取FRAGMENT的对象实例。
    /**
     * Launch the navigation by type
     *
     * @param service interface of service
     * @param <T>     return type
     * @return instance of service
     */
    public <T> T navigation(Class<? extends T> service) {
        return _ARouter.getInstance().navigation(service);
    }
  • 直接跳转Activity
  1. 因为Activity都是直接跳转的。所以不需要像Provider,BOARDCAST,CONTENT PROVIDER,FRAGMENT那样,返回一个对象。
  2. 返回值是null。因为已经帮你跳转好了。
  • 设置需要注入的对象。
    /**
     * Inject params and services.
     */
    public void inject(Object thiz) {
        _ARouter.inject(thiz);
    }
  1. Activity和Fragment,有时在返回时需要返回值,都保存在Intent里面。而inject()就是简化这个作用。
  2. 只有activity 和 fragment可以通过注解@Autowired,注入返回参数值。

以上是ARouter类的功能性介绍。

 

 类似资料: