亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

用Kotlin打造一個Router的示例代碼

2024-07-21 23:03:45
字體:
來源:轉載
供稿:網友

0.

最近接收了從前的項目,之前的代碼比較凌亂,準備重構。整個項目其實功能比較明顯,而且產品還想給他打造成比較成熟牛逼的app,那么組件化開發勢在必行。眾所周知,模塊開發,路由先行,就有了這篇文章。自從用了Kotlin后,感覺Java那些繁瑣的語法和喋喋不休的空指針判斷讓人惡心,于是決定用Kotlin來寫一個Router

1.

項目地址Router

代碼,想好再寫,首先分析一下為什么需要模塊化開發,為什么路由并且這個路由需要什么功能。

1.1

為什么使用模塊化開發:隨著項目的越來越大,如果把所有功能都放到一個module里,對開發和測試來說都有一個效率問題,對開發來講,由于各種業務代碼混合在一起,出現問題不好定位,對測試來講,每次修改都要重新編譯整個項目測試。采用組件化開發,講業務模塊分到一個一個module里,彼此間相互獨立,這樣既容易定位問題,也方便測試人員進行測試,因為只需要測試相應的module即可。所以我們的項目結構應該是這樣的

Kotlin,Router

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文件,里面只有一個方法

public void putRouteClass(ArrayMap<String, Class<?>> routableMap) {routableMap.put("test", MainActivity.class);}

根據講每個module里添加注解的Activity和fragment的class對象放入傳入的map里。之后再Application的onCreate方法里,調用Router的register方法

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對象,那想怎么搞就怎么搞了

//類似startActivityfun go(context: Context, url: String, extras: Bundle? = null)  {    val intent = Intent(context, classMap[url])    if (extras != null)    {      intent.putExtras(extras)    }    context.startActivity(intent)  }  fun go(fragment: Fragment,url: String, extras: Bundle? = null)  {    val context=fragment.context    if(context!=null)    {      go(context, url, extras)    }  }  //類似startActivityForResult  fun goForResult(context: Context, url: String, requestCode: Int, extras: Bundle? = null)  {    val intent = Intent(context, classMap[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?  {    try    {      val cla = classMap[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

apply plugin: 'kotlin-kapt'dependencies {kapt project(':processor')api project(':router')}

3.3

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

4.

其實在上家公司的時候就打算寫一個路由,只是由于種種原因最近沒能成型,這里只是給大家提供一種思路,作為思路文,就不在普及注解和編譯時注解解釋器了,請自行查詢資料。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到kotlin教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品久久久| y97精品国产97久久久久久| 国产一区深夜福利| 欧美在线观看网站| 久久69精品久久久久久久电影好| 国产精品亚洲欧美导航| 精品久久久久久电影| 热久久视久久精品18亚洲精品| 亚洲国产精品va在看黑人| 亚洲va男人天堂| 精品自在线视频| 精品国产老师黑色丝袜高跟鞋| 欧美日韩免费观看中文| 最新亚洲国产精品| 久久成人人人人精品欧| 日韩专区中文字幕| 欧美裸体xxxxx| 色老头一区二区三区在线观看| 欧美国产精品日韩| 成人黄色激情网| 日韩中文字幕在线播放| 日韩在线www| 欧美二区在线播放| 欧美精品中文字幕一区| 日韩欧美国产骚| 久久久欧美精品| 91网在线免费观看| 精品中文字幕久久久久久| 91免费欧美精品| 欧美电影在线观看高清| 亚洲精品视频网上网址在线观看| 在线播放国产一区中文字幕剧情欧美| 亚洲欧美国产另类| 欧洲日本亚洲国产区| 欧美综合在线第二页| 久久国产精品久久久久久| 亚洲国产精品久久精品怡红院| 亚洲一区二区在线| 亚洲午夜精品久久久久久久久久久久| 欧美在线视频在线播放完整版免费观看| 亚洲sss综合天堂久久| 国产日韩av在线| 萌白酱国产一区二区| 国产精品久久久久久中文字| 国产精品日日做人人爱| 日韩电视剧免费观看网站| 中文字幕av一区二区三区谷原希美| 色偷偷91综合久久噜噜| 超碰精品一区二区三区乱码| 欧美精品中文字幕一区| 日韩免费电影在线观看| 国产精品∨欧美精品v日韩精品| 日韩在线免费观看视频| 美日韩精品免费视频| 日本韩国欧美精品大片卡二| 成人欧美一区二区三区黑人孕妇| 欧美精品亚州精品| 亚洲激情视频在线播放| 久久九九国产精品怡红院| 日韩av在线不卡| 日韩在线观看免费高清完整版| 91美女片黄在线观| 亚洲精品自拍第一页| 欧美午夜片在线免费观看| 成人97在线观看视频| 亚洲欧美综合v| 少妇高潮久久久久久潘金莲| 九九综合九九综合| 91po在线观看91精品国产性色| 色综合五月天导航| 全亚洲最色的网站在线观看| 亚洲va欧美va在线观看| 亚洲一二在线观看| 国产精品美女免费看| 久久国产精品电影| 亚洲国内精品视频| 精品成人av一区| 午夜精品一区二区三区在线视| 国产成人avxxxxx在线看| 91在线|亚洲| 久久天天躁狠狠躁夜夜爽蜜月| 日韩精品免费综合视频在线播放| 欧美电影在线观看高清| 亚洲丁香久久久| 91精品国产自产在线观看永久| 亚洲一区二区三区成人在线视频精品| 国产欧美日韩亚洲精品| 中文字幕亚洲天堂| 亚洲精品久久视频| 亚洲黄色av女优在线观看| 亚洲高清不卡av| 日韩va亚洲va欧洲va国产| 国产亚洲激情在线| 欧美精品videosex性欧美| 久久久免费电影| 国模视频一区二区| 久久韩国免费视频| 欧美激情久久久| 亚洲高清久久久久久| 国产精品国产福利国产秒拍| 亚洲iv一区二区三区| 日韩电影中文字幕av| 亚洲午夜av久久乱码| 日韩动漫免费观看电视剧高清| 国产精品看片资源| 久久av中文字幕| 欧美成人精品在线视频| 日韩在线观看免费全| 国产精品老女人精品视频| 日韩电影大片中文字幕| 一本色道久久综合亚洲精品小说| 久久久精品一区二区三区| 最近2019年手机中文字幕| 久久久国产精品视频| 91禁国产网站| 8x海外华人永久免费日韩内陆视频| 日韩精品高清在线| 91免费人成网站在线观看18| 亚洲男人天堂2023| 日韩在线免费av| 亚洲欧洲在线观看| 日韩av免费看| 亚洲天堂第二页| 最新91在线视频| 国产精品白嫩美女在线观看| 成人有码视频在线播放| xx视频.9999.com| 亚洲视频欧美视频| 尤物精品国产第一福利三区| 日本中文字幕久久看| 欧美成人激情视频| 一本色道久久88综合亚洲精品ⅰ| 91性高湖久久久久久久久_久久99| 日韩国产精品亚洲а∨天堂免| 国产精品九九九| 超碰91人人草人人干| 青青草原成人在线视频| 久久久久北条麻妃免费看| 92福利视频午夜1000合集在线观看| 热久久99这里有精品| 成人免费大片黄在线播放| 国产精品福利观看| 亚洲国产天堂久久综合网| 日韩一区av在线| 国内精品视频久久| 欧美福利视频网站| 久久亚洲国产精品| 国产综合在线观看视频| 一区二区欧美久久| 精品国产91乱高清在线观看| 午夜精品久久久久久久久久久久| 亚洲综合日韩中文字幕v在线| 欧美久久精品午夜青青大伊人| 亚洲成人av片| 亚洲一区二区三区成人在线视频精品| 亚洲精品456在线播放狼人| 国产精品国产亚洲伊人久久| 欧日韩不卡在线视频| 亚洲老头同性xxxxx| 成人做爽爽免费视频| 91色p视频在线| 97在线看免费观看视频在线观看| 欧美日韩中文字幕| 欧美黑人国产人伦爽爽爽|