Android Library 和 IDs 的愛恨情仇 | 掘金技術徵文

版權聲明:java

本帳號發佈文章均來自公衆號,承香墨影(cxmyDev),版權歸承香墨影全部。android

未經容許,不得轉載。模塊化

1、前言

由於業務須要,須要把手上一個項目,按模塊拆分出來,進行模塊化處理,來適應不一樣的版本需求。大體的流程就是按模塊化的思想,將各個業務進行拆分,總之就是一堆解耦的操做。模塊化的好處有不少,這裏就不一一說明了。設計

肯定好須要拆分的模塊以後,其實具體業務代碼都是現成的,只是須要制定好接口,而後"有技巧"的複製現有代碼到各個該在的模塊內就能夠了。在這個過程當中,碰到一些問題,在一些原有代碼中,使用 switch-case 操做一些 IDs 的資源的時候,本來是沒有問題的,可是當它被複制到 Android Library 中的時候,就開始提示錯誤了,表示沒法這樣使用,下面就這個問題來進行一個簡單的講解,並提供一個快速解決的方法。3d

2、爲何會有這樣的問題?

咱們先來看看報錯信息。code


點擊查看更多『more』。


能夠看到錯誤的說明。這裏明說了,沒法在 Android Library 中,使用 switch 語句,來操做一個 IDs 的資源。

那麼是什麼致使出現這樣的問題呢?cdn

咱們知道,switch 語句的 case 操做必須是一個常量。而在 App Module 中,IDs 自己在 R.java 中就是被定義爲一個一個常量而存在的,那麼在 Android Library 中,這一點是否會有變化呢?blog

先來看看 App 的 R.java。接口


再來看看 Android Library Module 中生成的 R.java 文件。


能夠看到,確實是有不同的,在 Android Library Module 中,生成的 R.java 文件中,全部的 IDs 都是 static 的,而非 static final 的。也就是說,它再也不是一個常量了。

而官方其實也有資料來講明這個問題。ip

tools.android.com/tips/non-co…

有興趣的能夠直接閱讀原文,大體的意思是在 SDK Tools r14 開始,在 Library Module 中,會將 IDs 的資源,聲明爲 static 而非 static final 。

而這麼設計的緣由是,在多個 Module 組合的項目中,若是須要確保每一個 Module 中的 IDs 資源的值在整個項目中都是惟一的話,就須要每次編譯的時候都將全部的資源和相關的 Java 代碼與主項目一塊兒從新編譯,爲每一個 IDs 的資源,都生成一個惟一的值,這樣就會影響構建的效率。同時它也限制了發佈 Android Library 就必須發佈源碼,從而限制了 Android Library 的使用範圍。因此在 SDK Tools r14 開始,就將 Android Library 中的 IDs 標記爲非 final 類型的。

3、如何快速替換 Switch 語句

而官方也提供瞭解決方案,就是使用 if-else 語句替換 switch-case 語句。若是咱們是從零開始編寫邏輯,直接使用 if-esle 來編寫這種邏輯便可,可是咱們是在 copy 一個現有的項目,那麼問題就變成了,如何快速的將 switch-case 替換爲 if-else 語句。

在 Android Studio 中,是提供了快捷鍵來一鍵替換的。若是沒有修改過,在 Mac 中,快捷鍵是 command + return ,在 Windows 中,快捷鍵是 Alt + Enter


若是快捷鍵有變更,能夠在 KeyMap 中,查找 Show Intention Actions ,查看被設置的快捷鍵。


而 Intention 實際上提供了很是多的快捷操做,這裏只是命中了當前 switch 替換 if 的場景了而已,更多的快捷操做,能夠在 Intentions 窗口中查看。

4、結語

自己這樣的一件事情,根據 提示就解決了,可是做爲開發者,不該該只是知足解決問題,應該從更深層次的來探討問題的緣由,爲何如此設計,如何快速的解決這個問題。

公衆號二維碼.jpg
相關文章
相關標籤/搜索