代碼冗餘,六大Android懶人庫幫你解決

2021-01-14 IT168

  【IT168 評論】Android開發是當下最火的開發方向之一,但是在開發過程中我們會發現它有一個很大的弊端就是代碼重複很多,Android代碼需要和很多UI組件建立關係,後臺也需異步執行很多操作,所以很容易就導致了「義大利麵條」式代碼。為了解決以上問題,保持代碼的清晰和可讀性,今天我們為大家介紹六個Android庫。

  Retrofit是Square公司開發的一款針對Android網絡請求的框架,Retrofit2底層基於OkHttp實現的,OkHttp現在已經得到Google官方認可,大量的app都採用OkHttp做網絡請求,其源碼詳見OkHttp Github。雖然它不是一個革命性的應用程式,它的功能很齊全,如執行網絡、圖像使用、創建組件列表、響應用戶輸入等等。

  接下來,我們就把這些庫應用到代碼中,看看它們是如何幫助我們維護代碼乾淨簡潔的。

  1.Butter Knife

  每訪問一次視圖我們都需要獲取一次該視圖的對象實例,我們可以通過使用rootView.findViewById()方法將返回的對象轉換為正確的視圖類型。但是當代碼建立起來,之後你會發現這其中有很多相似的語句,尤其是在onCreate和onCreateView方法中。onCreate方法初始化所有,然後綁定偵聽器,它需要把整個UI都綁在一起,所以UI元素越多,方法就會越長。

  我們簡單舉個例子,假設這個視圖需要三個視圖,兩個EditTexts和一個Button,一般來說,我們都是這樣做:

  除了將它們存儲在活動的欄位中,可以從布局中查找視圖,添加了一個匿名的內部類作為偵聽器來處理搜索命令之外,代碼中沒有其它功能。這時,我們可以使用Butter Knife來簡化代碼,視圖對象存儲在欄位中,我們可以簡單地向每個欄位添加Butter Knife @BindView注釋,如下所示:

  然後我們還需要使onCreateView方法知道Butter Knife的存在,只需要執行下方的初始化代碼即可:

  之後,我們將監聽器綁定到searchButton方法,並改為註解onSearchButtonClicked方法,將它綁定到按鈕的點擊事件中@OnClick。

  Buffer Knife主頁還有很多例子可供開發人員參考,一般來說,只要你需要以編程方式來訪問視圖元素,Butter Knife都會讓你的代碼變得簡潔可讀。

  2.Ice Pick

  很多Android應用程式都會面臨同一個問題,那就是活動和片段生命周期的不正確處理。我們都知道這是Android代碼中不優雅的部分,但是AndroidManifest文件中禁用橫向模式,當用戶將設備側向移動時,應用程式不會崩潰並非一個正確的解決方案:首先,因為它看起來有點蠢,其次,代碼不能正確處理的配置更改問題仍會發生。所以,最關鍵的就是你要正確處理應用程式組件的狀態和生命周期。

  實現這一目標的方式是將活動中所有欄位的內容存儲到一個bundle中,然後由Android框架通過生命周期正確管理。

  Ice Pick的出現簡化了這一過程,它主要用於簡化保存和恢復實例狀態的生命周期,我們不再需要一個一個的講所有變量保存到bundle中。下面進行一個實例示範,我們需要記住最後一家公司和存儲庫搜索的組合。

  首先,我們註解要保存到bundle中的欄位:

  @State String lastSearchCombination;

  然後在onSaveInstanceState()方法中調用Ice Pick:


  調用onCreateView()方法中的Ice Pick來恢復狀態:


  需要注意的一點是保存到bundle中的限制仍然存在,所以無需再為bundle添加常量或為savedInstanceState添加空檢查。

  3.Dart and Henson

  Extra是Android標準的組件之間(Activity/Fragment/Service等)傳遞數據的方式。Dart通過註解處理器在編譯階段生成一些代碼,幫助我們避免寫入從一個活動傳遞到另一個活動的Intent Extras的所有鍵和檢查。它適用於Fragments。

  接下來,會為大家講解一個小例子,如何使用@InjectExtra注釋將搜索關鍵字從搜索屏幕傳遞到貢獻者列表,實際上執行搜索的地方。

  首先使用@InjectExtra註解定義兩個類變量:

  @InjectExtra String repositoryQuery;

  @InjectExtra String companyQuery;

  Dart.inject(this,getActivity());被調用之後,所有的一切都會被自動初始化。現在需要考慮的是在Bundle中被添加到Intent的extras會如何?你可以手動進行,也可以選用Henson。接下來將下方代碼添加到SearchFragment:


  這樣就簡化了代碼中活動之間的通信,無需每次都手動指定txtra。

  4.Parceler

  在安卓中要傳遞數據或者保存狀態,對象需要實現Serializable或者Parcelable。與傳統的Serializable相比,Parcelable被認為更快,因為它沒有反射的負擔(以及更少的內存),因此更適合移動app。

  實現一個Parcelable需要做更多的工作。雖然Android Studio有一個自動生成代碼的工具,但是每次class改變的時候都要重複這一步。而Parceler恰好可以解決這個問題,它可以幫助你進行對象序列化,幫助你傳遞任何對象作為Intent extra。

  Parceler使用了一個註解處理器,因此首先需要應用Android APT 插件,那樣你的IDE才能知道生成的類,而註解處理產生的代碼菜不會包含在apk中。另外,Icepick,Henson和Dart也能和諧地和Parceler一起玩。

  5.Timber

  Timber是一個小的可擴展的日誌工具。通常,我們在寫代碼的時候都會不可避免的出現一些錯誤,繼而導致應用程式意外宕掉。這時,我們需要重現它,才能解決問題。如果你清楚重現的步驟,那麼使用調試器就很方便,但是如果不清楚,也可以使用日誌。

  Android提供的開箱即用的日誌類也可以提供不同的日誌記錄級別,使用也很方便,但是它有一個特點,就是每個Log.d()語句都需要兩個參數; 首先是tag,第二是message,而tag在99%的時間裡都是this.class.getName(),它要一次次的寫入。如果我們使用Timber庫就可以這樣做:

  Timber.d("Informative output that needs to be logged.");

  上面的語句可以自動匹配正確的默認標記。此外,在使用之前要初始化Timer:

  Timber.plant(new Timber.DebugTree());

  6.Dagger and Dagger 2

  Dagger2是一個Java和Android的依賴注入框架,使用依賴注入有哪些好處呢?使用類和被依賴的對象構造分開,這樣如果我們需要改變被依賴類的構造方法,不必改動每一個使用類;對各種被依賴類的實例,可以只構造一次;當我們需要更換一種實現時,只需要保證接口一致;利於單元測試,我們可以方便地mock依賴類的對象。

  Dagger 1是由Square公司受到Guice啟發創建的,可以說是Android上最流行的依賴注入框架,它在編譯的時候實行綁定,同時也用到了反射機制。Dagger2是Dagger1的分支,由谷歌公司接手開發,相較於Dagger1,性能更好,更易於跟蹤測試。

相關焦點

  • Python代碼轉Latex公式,這個開源庫用一行代碼幫你搞定
    機器之心報導編輯:小舟你的代碼中有數學公式嗎?數學是數據科學和機器學習的重要基礎,數學運算的結果對於機器學習項目而言是至關重要的。在編寫代碼時,我們常常需要定義數學公式的計算形式。像 S=r^2 這樣簡單的數學公式,大概不會出現拼寫錯誤。但如果是下面這樣的公式呢?
  • 通過LLVM 在 Android 上運行 Swift 代碼
    也就是說,不是生成特定架構的機器代碼,LLVM 為一個虛擬機生成彙編代碼,然後轉換成中間代碼,適配架構需要的實際代碼。模塊化的設計非常的好,因為允許高度代碼復用(前端和後端的共享優化)。適配不同的機器在這一點上,你可能會想:如果 LLVM 已經夠模塊化,那麼我們是否可以使用一個不同的後端,生成二進位代碼,適配 OS X,iOS 或者是 Android?假設是可以的,我們來看看如何實現。手動構建 Swift 代碼如果使用 Xcode,系統會自動完成這些。
  • Android上玩玩Hook:Cydia Substrate實戰
    這就使我們希望通過一個程序改變其他程序的某些行為的想法不能直接實現,但是Hook的出現給我們開拓了解決此類問題的道路。當然,根據Hook對象與Hook後處理的事件方式不同,Hook還分為不同的種類,如消息Hook、API Hook等。
  • 15個優秀的開源項目,讓你輕鬆應對Android開發
    【公眾號回復「1024」,送你一個特別推送】聲明原創|本文為codeGoogler授權發布,未經允許請勿轉載
  • 「原創」如何高效管理你的js代碼
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫1.為什麼需要管理好js代碼1.1 你有遇到這些情況嗎其他項目使用自己慢慢豐富的工具類,你是copy過去的?難免需要刪除整個node_modules並重裝依賴庫,你會因為重寫過某些庫的代碼而糾結?
  • 2014 非常好用的開源 Android 測試工具
    calabash-android 是一個基於 Cucumber 的 Android 的功能自動化測試框架。Calabash 允許你寫和執行,是開源的自動化移動應用測試工具,支持 Android 和 iOS 原生應用。Calabash 的庫允許原生和混合應用的交互測試,交互包括大量的終端用戶活動。Calabash 可以媲美 Selenium WebDriver。但是, 需要注意的是 web 應用和桌面環境的交互跟觸控螢幕應用的交互是不同的。Calabash 專為觸控螢幕設備的原生應用提供 APIs。
  • com.android.systemui已停止是什麼意思 怎麼解決
    com.android.systemui已停止是什麼意思 怎麼解決 來源:www.18183.com作者:皮卡時間:2016-01-20 我們如果需要解決手機使用中出現com.android.systemui已停止運行的問題,那麼我們首先要搞清楚com.android.systemui
  • Android P 行為變更
    更新 ICU 庫 平臺使用的 ICU 庫已更新至 ICU 58 版本;Android 8.0 (API 版本 26) 和8.1 (API 等級 27) 使用的 ICU 庫則更新至 ICU 60 版本。
  • 這幾個常用的python庫你需要知道
    功能強大、應用廣泛,可以幫你搜集工作數據,還能幫你下載音樂,電影,於是就掀起了一波學習python的大潮,小編也毫不猶豫的加入了。但是對於向小編一樣的小白來說,剛開始學習還是有些困難的,需要首先了解python的一些基礎知識。所以小編就整理了一些常用的python庫,希望對正在學習python的小夥伴有所幫助。
  • 水光針注射六大雷區,家恩德仁先幫你踩了!
    家恩德仁又來幫你避雷啦!關於水光針的六大誤區,看看你踩了多少~在這個寒冷的冬季,妹紙們是不是很明顯的感受到自己的皮膚,膚色不均、乾燥起皮,細紋皺紋、毛孔粗大....90%肌膚問題都是因為「皮膚缺水」引起的,當你「敷面膜」「保溼」都沒有用的時候,你就需要「水光針」瞭然而,對於水光注射很多妹紙們可能存在誤區今天,就讓家恩德仁來為各位深扒這些年
  • 這份自查清單幫你理清思路
    你應該了解到:問題的本質(有監督的 / 無監督的,分類問題 / 回歸問題)。你可以開發的方案類型。應該用什麼指標來度量性能?機器學習是解決這個問題的正確方法嗎?解決該問題的手動方法。步驟 6:優化你選出的模型並檢查相關方法這是你更加接近最終解決方案的關鍵步驟之一,具體步驟如下:用交叉驗證優化超參數;用隨機搜索或網格搜索等自動調整方法來找出最佳模型的最佳配置;
  • 基於FPGA的循環冗餘校驗碼設計
    為了最大限度地保證通信過程中信息的完整性,需 要採用信道編碼技術對可能發生的差錯進行有效地控制,而 循環冗餘校驗碼就是其中一個最有效的編碼技術。本文引用地址:http://www.eepw.com.cn/article/201703/344838.htm1  循環冗餘校驗碼基本思想循環冗餘校驗碼是一種校錯能力很強且使用非常廣泛 的差錯檢驗方法。
  • 以VON CHAIN為例,技術小白怎麼看懂黑貓Github開原始碼庫?
    其實啊,要判斷一個項目是不是真的有技術實力並沒有大家想像中那麼難,你只要在它們公開的Github開原始碼庫中查看幾個數據,項目大概的開發水平也心裡有數了。點評:VON CHAIN從很早之前就已經開始布局,其技術團隊開發意願強,且開發能力高,代碼更新保持頻繁,對比大多數項目VON CHAIN開發進度非常快,並且相當持久。2)點讚收藏次數判斷方法:Github開原始碼庫中,每個文件夾的星星數量。
  • 繼斯瓦爾巴全球種子庫,承載著人類歷史的開原始碼也存放到了北極
    種子庫看起來就像電影裡的某個場景,它的入口是一個三角形方尖碑,高高地聳立在一片白茫茫之中。它閃爍著綠光。這是北極世界檔案館,種子庫的堂兄可沒那麼性感。弗裡德曼用一把簡單的門鑰匙打開了貨櫃門,然後在裡面存放了世界上大部分的開源軟體代碼。伺服器和快閃記憶體驅動器不夠耐用,因此數據被編碼在看起來像老式電影膠捲的東西上,每個重幾磅,儲存在一個披薩盒大小的白色塑料容器中。它基本上是縮微膠片。
  • android藍牙相關框架專題及常見問題 - CSDN
    一、前言本文側重點:Android中藍牙代碼結構分析。代碼來源於Android P,本文相關代碼:client:frameworks/base/core/java/android/bluetooth/*system/bt/binder/android/bluetooth/**.aidlservie:framework/base/services/core/java/com/android/server/BluetoothService.java
  • Python安裝庫文件報錯之Read timed out解決之道!
    ,我會推出更多關於報錯時的解決之道。或許這篇文章現在不能幫到你什麼,但是希望你點個關注加給個評論,謝謝!話不多說直接上乾貨。解決之道是設置一下你自己的time out,怎麼設置了,我這裡為你整理好了代碼:在你的cmd中輸入:python -m pip --default-timeout=100 install你所要下載的庫文件名。記住是你的文件庫名,這樣你才能躲過被超時的報錯。而第二種報錯的可能性就是你的Python自帶的pip沒有及時的更新,也會造成庫文件的超時。
  • 不用從零學android入門編程,這款傻瓜式開發工具,快速製作App
    過去要開發一款專業的APP軟體,只能通過程式設計師敲代碼製作。現在,不需要從零開始學android編程技術,任何人都可以輕鬆製作手機APP。國外的網際網路巨頭:比如谷歌的輕代碼 H5 應用開發工具——App Maker,微軟的PowerApps,就是通過拖拽式的進行應用開發。
  • 2020年六大機器學習Python庫!
    外頭有許多類型的python庫可用,本文介紹了一些流行的機器學習庫。1. NumPy:NumPy是一種通用的數組處理軟體包。它提供高性能的多維數組對象和用於處理這些數組的工具。它是用於科學計算的基本Python軟體包。NumPy針對Python的CPython參考實現,這是一種非優化的字節碼解釋器。
  • 代碼不止|想制勝海外市場?Google 來幫你!
    代碼不止|想制勝海外市場?Google 來幫你! 全民數位化時代下,強大的數據處理能力成為出海之路上的制勝法寶,Google Cloud 帶來三大關鍵技術更新,助力構建高性能且具備彈性的數據分析平臺,幫助出海企業乘風破浪。
  • 懶人秘籍:教你如何避免編寫pandas代碼
    而大家都在儘可能地避免這種懸崖峭壁,結果可想而知,都轉向了如何避免編寫pandas代碼。在過去4年裡,筆者一直使用pandas作為數據分析的主要工具。必須承認,「如何避免編寫pandas代碼」的大部分內容來自於使用pandas編程的起步階段。在進行代碼審閱時,筆者仍然看到許多經驗豐富的程式設計師在看一些熱門「如何避免使用」的帖子。