国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - 用Kotlin打造一個Router的示例代碼

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

2022-01-24 15:58滑板上的老砒霜 Android

本篇文章主要介紹了用Kotlin打造一個Router的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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對象,那想怎么搞就怎么搞了

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//類似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

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

3.2

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

?
1
2
3
4
5
apply plugin: 'kotlin-kapt'
dependencies {
kapt project(':processor')
api project(':router')
}

3.3

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

4.

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.jianshu.com/p/185deb9f8615

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 免费看一区二区三区 | 99精品欧美一区二区三区综合在线 | 国产精品v一区二区三区 | 一区二区三区亚洲 | 亚洲国产免费 | 日本高清视频在线播放 | 综合色导航 | se在线播放| 国产高清视频在线 | 日韩精品视频在线观看一区二区 | 在线观看成人 | 99热这里有精品 | 五月婷婷在线观看 | 亚洲精品电影在线观看 | 91精品视频免费在线观看 | 欧美一区二区三区的 | 国产精品99久久免费观看 | 久久这里只有精品久久 | 欧美日韩久| 成人免费视频在线观看 | 久久久久久久久久久久国产 | 北条麻妃在线一区二区免费播放 | 国产精品福利在线 | 欧美 国产精品 | 黄色毛片网站在线观看 | 狠狠操av | 国产免费自拍 | 每日更新av| 久久av一区二区三区亚洲 | 国产精品第一国产精品 | 中文字幕在线电影观看 | 美女视频一区二区三区 | 日韩成年网站 | 欧美日韩高清在线一区 | 日韩三级电影在线观看 | 欧美精品在线视频 | 亚洲电影在线观看 | 一区二区视频 | 天天干天天搞天天射 | 欧美韩日 | 中文字幕永久第一页 |