1. 程式人生 > >我所理解的Android模組化(四)——常見問題和注意事項

我所理解的Android模組化(四)——常見問題和注意事項

   關於Android模組化,前面已經寫了三篇文章,沒有了解的大家可以先去看一下,附上鍊接地址:

  下面主要來說一下Android模組化過程中的常見問題和注意事項:

注意事項

  記得在一篇技術部落格中看到微信Tinker的開發人員說過一句話:“熱更新不是請客吃飯!”,說的很有道理。雖然模組化沒有熱更新那麼多相容性問題,那麼多坑,因為模組化完全是利用AndroidStudio自帶的gradle的方式編譯來實現多模組,所以不會存在或者很少存在相容性問題。但是專案的模組化過程也並不輕鬆,特別是傳統的開發很久的老專案想要實現模組化必然會經歷一翻陣痛,如此說來也不是一個輕鬆的事情,所以在開始模組化之前有很多注意事項需要清楚。

   從傳統的專案到模組化重構是一個漫長的過程,不可能一蹴而就,需要在平時的開發中慢慢的重構成模組化。參與重構的開發人員必須熟悉他所重構的業務模組,熟知重構業務模組中的跳轉和其他模組的互動邏輯,這樣才能做到模組化的同時不會破壞原有的業務邏輯和實現,畢竟重構對於開發人員來說往往是一個非常痛苦的過程,需要毅力和決心,因為誰也不希望把原本正確的程式碼改壞了,但是重構完成之後,模組化的構建方式還是有助於將來的開發的,是一件非常值得的事情。

常見問題

  1.模組化專案中的onClick、onItemClick等各種回撥方法中的不能使用switch (view.getId()) case語句會報錯.

需要替換成 if (id == R.id.bt_login_success) else 來替代。

這裡寫圖片描述
  需要改成 下面的程式碼

        int id = view.getId();
        if (id == R.id.bt_login_success) {
            EventBus.getDefault().post(new LoginStateEvent(true));
        } else if (id == R.id.bt_login_fail) {
            EventBus.getDefault().post(new LoginStateEvent(false
)); }

  為什麼在library中不能使用switch , case語句,而APP中卻是可以的呢?
答案是因為case分支後面跟的引數必須是常量,而library中生成的view的R.java中的資源ID不是常量,導致不能使用,而在APP中生成的ID則是有final修飾的常量。

  module_user模組中的id沒有final修飾

      public static int tv_login_state = 0x7f0c0064;
      public static int tv_usercenter = 0x7f0c0065;

  app 模組中的id有final修飾

    public static final int right_side=0x7f07005d;

  2.模組化中能不能用ButterKnife框架或者已經使用了ButterKnife的專案模組化重構的時候還能不能使用?

  答案也是肯定的,但是不是十分推薦,使用原生的相容性更好。
要想繼續使用ButterKnife,首先需要在根目錄build檔案中匯入:

        classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'

  然後在想使用ButterKnife模組的build檔案中引入plugin和匯入庫:

apply plugin: 'com.jakewharton.butterknife'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

  這樣在註解@BindView的時候,只需要把R.id.rg_tab換成R2.id.rg_tab,library中R中id不是常量,所以會找不到這個id,而butterknife的外掛會自動幫我們生成R2檔案,裡面的id是常量型別,所以只需要把R替換成R2即可。

    @BindView(R2.id.rg_tab)
    RadioGroup rgTab;

  3.如果某一個模組沒有整合到主APP中來執行的時候點選這個模組會不會崩潰?

  如果模組沒有整合進來,想要跳轉到這個頁面的時候,不會崩潰,設定debug模式的時候會出現找不到的提示,而點選屬於這個模組的功能的時候則不會有反應。

  比如我們不整合module_user模組則會出現下圖這樣的提示:

這裡寫圖片描述

  所以每次打包釋出的時候我們都要仔細的檢查一下配置,是不是所有的模組化專案都整合到了主的APP中來了,防止模組被遺漏的情況。

本文已授權開發者技術前線 獨家釋出 侵權必究