国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發(fā) > 綜合 > 正文

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

2024-07-21 23:03:45
字體:
供稿:網(wǎng)友

0.

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

1.

項目地址Router

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

1.1

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

Kotlin,Router

1.2

為什么使用路由:上面說了,每個module是彼此獨立的,而要實現(xiàn)activity的跳轉(zhuǎn)就需要彼此引用,這是我們不想看到的,模塊間應(yīng)該是沒有依賴的,那么如何實現(xiàn)不同模塊的跳轉(zhuǎn)呢?就需要路由了。

1.3

這個路由需要什么功能:目前所需要的就是根據(jù)url實現(xiàn)不同模塊之間的Activity跳轉(zhuǎn),包括傳遞參數(shù),類似startActivity和startActivityForResult,得到不同模塊的fragment。

2.

需求想好了,該想怎么實現(xiàn)了。activity跳轉(zhuǎn)有兩種,隱式調(diào)用和顯示調(diào)用,如果采取隱式調(diào)用就要為每個activity注冊intent-filter,麻煩,那就只能顯示調(diào)用了,但是顯示調(diào)用是需要class對象的,不同module是不能得到class對象的,這怎么搞?編譯前得不到,運行時總行吧,所以我們需要一個容器來存儲不同moudle里的class對象,并且能通過一個值來進行區(qū)分,所以我們需要一個map,而值就是用來區(qū)分各個activity和fragment的url。

第二個問題來了,url如何確定,class對象怎么得到,又怎么放進map里。這里我們采用注解來做,我們用在注解里聲明了url,同時自定義Processor,在編譯時生成java文件,里面只有一個方法

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

根據(jù)講每個module里添加注解的Activity和fragment的class對象放入傳入的map里。之后再Application的onCreate方法里,調(diào)用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()      }    }  }

這個方法很簡單,調(diào)用每個module里利用Processor生成的對象的putRouteClass方法,將Router里的一個全局map傳入,這樣,這個map就持有了所有添加注解的Activity和fragment的url以及對應(yīng)的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.

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到kotlin教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产黄在线看| 免费视频二区| 国产网红在线观看| 免费网站看黄yyy222| 国产真实伦在线观看| 尤物视频在线看| 在线一二三区| 香蕉视频免费在线播放| 九色自拍视频| 91欧美在线视频| 欧美日韩亚洲第一页| 激情小说 在线视频| 1区不卡电影| 亚洲尤物在线视频| 最新天堂资源在线| 天天干天天摸| 国产精品9区| 欧美日韩在线精品成人综合网| 五月婷婷导航| www狠狠操| 国产视频青青| 久久精品国产麻豆| 国产精品秘入口| 麻豆精品传媒视频观看| 在线免费观看你懂的| 好看的中文字幕在线播放| 99精品老司机免费视频| 国产一卡二卡3卡4卡四卡在线| 精品麻豆国产| 国产激情视频在线观看| 国产在线www| 免费看成年人视频在线观看| 精品推荐国产麻豆剧传媒| 国产三级在线看| 国产麻豆精品高清在线播放| 日本福利在线| 性国产高清在线观看| 国产一区二区三区美女秒播| 丁香在线视频| 最新中文字幕av专区| 九色在线网站| 国产在线激情视频| 欧美高清视频| 超碰免费在线观看| 欧美日韩视频精品二区| jizz国产| 狠狠干天天爱| 国产精选在线视频拍拍拍| 黄色av免费看| 99色在线视频| 国产黄色片在线播放| 国产福利在线播放麻豆| 国产精品视频一区二区图片| 国产欧美日韩第一页| 国产福利视频在线| 在线伊人免费视频| 亚洲日本伊人| 免费精品国产自产拍观看| www.三级.com| 成人无遮挡免费网站视频在线观看| 九九热在线视频免费观看| 综合图区亚洲白拍在线| 91精品大全| 日本久久网站| 国产女呦网站| 国产性一级片| 在线观看免费高清完整| 欧美成人精品福利网站| 最近免费中文字幕大全免费第三页 | 国产精品亚洲第五区在线| 国产精品视频一区麻豆| 亚洲成a人v欧美综合天堂麻豆| 日韩在线天堂| 国产免费麻豆视频| 2019中文字幕在线电影免费| 日本视频三区| 精品全国在线一区二区| 免费a级在线播放| √天堂资源中文www| 国产蜜臀在线| 午夜影院在线| 18加网站在线| 久久精品国产亚洲777| 伊人影院在线播放| 国产经典自拍视频在线观看| 男人操女人免费网站| 国产羞羞视频| 国产美女福利在线| 精精国产xxxx视频在线动漫| 国产理论在线观看| 黄网站app在线观看下载视频大全官网| 91在线视频免费看| 91超碰免费在线| 久久精品国产麻豆| 日本卡一卡2卡3卡4精品卡网站| 91麻豆福利| 91美女主播在线视频| 国产人成精品| 国产三级在线观看| 国产深夜视频在线观看| 国产性色视频| 国产青青视频| 国产精品视频一区二区久久| 久久五月精品| 国产美女视频一区二区二三区| 欧美性受xxxx免费视频| 免费高清av| 好男人社区在线视频| 国内精品一区视频| 国产毛片毛片| 国产精品666| 精品推荐蜜桃传媒| 夜夜操天天干| 青青免费在线视频| 导航福利在线| 国产成人精品实拍在线| 国产成人精品综合网站| 中文一区在线观看| 亚洲综合激情六月婷婷在线观看| 精品国产丝袜高跟鞋| 亚洲va国产日韩欧美精品色婷婷| 超碰在线影院| 国产成人精品实拍在线| 亚洲一道本在线| 成年午夜在线| 精品极品三级久久久久| jizz亚洲| 国产高清在线| 久久精品亚洲7777影院| 国产黄色一级电影| 超碰在线人人| 99热播在线观看| 天堂在线一二区| 精品一二三四| 国产精品一区二区婷婷| av在线第一页| 国产精品久久久高清免费| www.五月色.com| 91美女在线| 国产亚洲依依| 九九精品九九| 亚洲精品久久久成人| 国产精品国产国产aⅴ| 青青久在线视频免费观看| 国产精品777一区二区| 久久精品蜜桃| www.操.com| 亚洲日本一区二区三区在线观看| 日本中文字幕高清视频| 日韩a视频在线观看| 精精国产xxxx视频在线中文版| 国内精品不卡| 麻豆网站在线免费观看| 午夜影院免费| 性网站在线播放| av在线二区| av色在线观看| 在线免费看av| 在线观看国产福利视频| 精品视频麻豆入口| 国产白浆在线| 在线看黄网站| 日韩黄色成人| 亚洲91av| www.91在线播放| 日本成人a视频| 久草在线视频网| 久久精品最新免费国产成人| 欧美韩日国产| 国产永久av在线| 最近中文字幕mv免费高清视频8 | 免费a级毛片在线观看| 青草av在线| 激情丁香婷婷| 国产一区二区影视| 精品久久九九| 欧美日韩视频精品二区| 青青草免费在线视频| yjizz视频网站在线播放| 超碰在线观看免费版| 丁香视频免费观看| 国产小视频在线| 亚洲男人的天堂成人| 超碰国产在线| 国产精品免费视频一区一| 在线国产网址| 中文字幕中文字幕在线中高清免费版| 国产黄色免费电影| 免费黄色网页在线观看| 国产精品国精产品一二| 青青草免费在线观看| 国产天堂素人系列在线视频| 国产成人亚洲综合小说区| 青青草在线免费观看| 国产羞羞视频在线播放| 日本韩国精品一区二区| 国产视频精选在线| 免费不卡中文字幕视频| 在线看a视频| 国产精品va在线观看视色|