最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用Kotlin打造一個(gè)Router的示例代碼

 更新時(shí)間:2018年05月04日 09:04:29   作者:滑板上的老砒霜  
本篇文章主要介紹了用Kotlin打造一個(gè)Router的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

0.

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

1.

項(xiàng)目地址Router

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

1.1

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

1.2

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

1.3

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

2.

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

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

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

根據(jù)講每個(gè)module里添加注解的Activity和fragment的class對(duì)象放入傳入的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()
      }
    }

  }

這個(gè)方法很簡單,調(diào)用每個(gè)module里利用Processor生成的對(duì)象的putRouteClass方法,將Router里的一個(gè)全局map傳入,這樣,這個(gè)map就持有了所有添加注解的Activity和fragment的url以及對(duì)應(yīng)的class對(duì)象。有了class對(duì)象,那想怎么搞就怎么搞了

//類似startActivity
fun 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

注冊(cè)注解解釋器的時(shí)候,不要使用google的autoservice庫了,采用resoureces,META-INF,不然沒效果。別問為什么,我也不知道

3.2

在gradle文件里使用注解解釋器使用kapt代替annoationProcessor

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

3.3

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

4.

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

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

西林县| 兴文县| 玉门市| 定陶县| 宜川县| 和平区| 永定县| 河南省| 南康市| 石林| 玉树县| 泗阳县| 闽侯县| 肥西县| 永丰县| 商丘市| 扶沟县| 和林格尔县| 永善县| 龙里县| 澄江县| 钟祥市| 龙泉市| 桃园市| 兰州市| 丽江市| 临清市| 永胜县| 响水县| 迁安市| 汝城县| 静海县| 博爱县| 湘西| 龙门县| 扬州市| 东安县| 惠水县| 乐陵市| 汽车| 林口县|