登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

查看: 191|回复: 7

用Kotlin打造一个Router的示例代码,java代码转kotlin

[复制链接]

488

主题

847

帖子

1028

安币

手工艺人

发表于 6 天前 | 显示全部楼层 |阅读模式

            

        0.

        最近接收了从前的项目,之前的代码比较凌乱,准备重构。整个项目其实功能比较明显,而且产品还想给他打造成比较成熟牛逼的app,那么组件化开发势在必行。众所周知,模块开发,路由先行,就有了这篇文章。自从用了kotlin后,感觉java那些繁琐的语法和喋喋不休的空指针判断让人恶心,于是决定用kotlin来写一个router

        1.

        项目地址router

        代码,想好再写,首先分析一下为什么需要模块化开发,为什么路由并且这个路由需要什么功能。

        1.1

        为什么使用模块化开发:随着项目的越来越大,如果把所有功能都放到一个module里,对开发和测试来说都有一个效率问题,对开发来讲,由于各种业务代码混合在一起,出现问题不好定位,对测试来讲,每次修改都要重新编译整个项目测试。采用组件化开发,讲业务模块分到一个一个module里,彼此间相互独立,这样既容易定位问题,也方便测试人员进行测试,因为只需要测试相应的module即可。所以我们的项目结构应该是这样的

        

        1.2

        为什么使用路由:上面说了,每个module是彼此独立的,而要实现activity的跳转就需要彼此引用,这是我们不想看到的,模块间应该是没有依赖的,那么如何实现不同模块的跳转呢?就需要路由了。

        1.3

        这个路由需要什么功能:目前所需要的就是根据url实现不同模块之间的activity跳转,包括传递参数,类似startactivity和startactivityforresult,得到不同模块的fragment。

        2.

        需求想好了,该想怎么实现了。activity跳转有两种,隐式调用和显示调用,如果采取隐式调用就要为每个activity注册intent-filter,麻烦,那就只能显示调用了,但是显示调用是需要class对象的,不同module是不能得到class对象的,这怎么搞?编译前得不到,运行时总行吧,所以我们需要一个容器来存储不同moudle里的class对象,并且能通过一个值来进行区分,所以我们需要一个map,而值就是用来区分各个activity和fragment的url。

        第二个问题来了,url如何确定,class对象怎么得到,又怎么放进map里。这里我们采用注解来做,我们用在注解里声明了url,同时自定义processor,在编译时生成java文件,里面只有一个方法

[Java] 查看源文件 复制代码
public void putrouteclass(arraymap<string, class<

        根据讲每个module里添加注解的activity和fragment的class对象放入传入的map里。之后再application的oncreate方法里,调用router的register方法

[Java] 查看源文件 复制代码
fun register(vararg modulenames: string)
  {
    for (modulename in modulenames)
    {
      try
      {
        val cla = class.forname(constants.package_name + constants.dot + modulename + "_" + constants.router_table_imp)

        val routertable = cla.newinstance() as routertable

        routertable.putrouteclass(classmap)
      } catch (e: classnotfoundexception)
      {
        e.printstacktrace()
      } catch (e: exception)
      {
        e.printstacktrace()
      }
    }

  }

        这个方法很简单,调用每个module里利用processor生成的对象的putrouteclass方法,将router里的一个全局map传入,这样,这个map就持有了所有添加注解的activity和fragment的url以及对应的class对象。有了class对象,那想怎么搞就怎么搞了

[Java] 查看源文件 复制代码
//类似startactivity
fun go(context: context, url: string, extras: bundle[url])

    if (extras != null)
    {
      intent.putextras(extras)
    }

    context.startactivity(intent)
  }

  fun go(fragment: fragment,url: string, extras: bundle[url])

    if (extras != null)
    {
      intent.putextras(extras)
    }

    if (context is activity)
    {
      context.startactivityforresult(intent, requestcode)
    } else if (context is fragment)
    {
      context.startactivityforresult(intent, requestcode)
    }
  }

 //得到fragment
  fun getfragment(url: string): fragment[url]

      if (cla != null)
      {
        return cla.newinstance() as fragment
      } else
      {

      }

    } catch (e: classnotfoundexception)
    {
      e.printstacktrace()
    } catch (e: exception)
    {
      e.printstacktrace()
    }
    return null
  }

        3.有些坑:

        3.1

        注册注解解释器的时候,不要使用google的autoservice库了,采用resoureces,meta-inf,不然没效果。别问为什么,我也不知道

        3.2

        在gradle文件里使用注解解释器使用kapt代替annoationprocessor

[Java] 查看源文件 复制代码
apply plugin: 'kotlin-kapt'
dependencies {
kapt project(':processor')
api project(':router')
}

        3.3

        生成的java文件在每个module的build/generated/source/kapt里

        4.

        其实在上家公司的时候就打算写一个路由,只是由于种种原因最近没能成型,这里只是给大家提供一种思路,作为思路文,就不在普及注解和编译时注解解释器了,请自行查询资料。






        

27

主题

9355

帖子

1893

安币

Android大神

Rank: 6Rank: 6

发表于 6 天前 | 显示全部楼层
支持楼主,支持安卓巴士!

307

主题

673

帖子

693

安币

手工艺人

发表于 5 天前 | 显示全部楼层
楼主威武,以后多发干货,多办活动~!

488

主题

832

帖子

2046

安币

手工艺人

发表于 5 天前 | 显示全部楼层
安卓巴士是个不错的网站,我来顶个贴~

465

主题

9563

帖子

829

安币

代码手工艺人

Rank: 4

发表于 5 天前 | 显示全部楼层
帮帮顶顶!!

1

主题

9041

帖子

2571

安币

Android大神

Rank: 6Rank: 6

发表于 5 天前 | 显示全部楼层
感谢分享,安卓巴士有你更精彩:lol

0

主题

8897

帖子

2084

安币

Android大神

Rank: 6Rank: 6

发表于 5 天前 | 显示全部楼层
楼主是好人,回个帖会有安币吗?

41

主题

185

帖子

2941

安币

Android大神

Rank: 6Rank: 6

最佳新人签到达人原创勋章

发表于 3 天前 | 显示全部楼层
太简单了  该说的没有说具体。。也没有源码demo   建议深入一点讲解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表