DrySister看妹子應用(第一版)——5.程式碼回顧,調整與日誌類編寫

coder-pig發表於2017-12-20

DrySister看妹子應用(第一版)——5.程式碼回顧,調整與日誌類編寫

標籤: DrySister


1.一些BB


    說來慚愧,DrySister的上一篇距今已經有一年多了,期間有不少小夥伴
都曾私信過我說寫得很好,穩什麼時候更,我基本都回復說太監了…
具體原因各種各樣吧,最近一段時間比較閒,就想把第一版的完結了吧。
之前剛開始寫的時候是AS 2.1.2,現在都AS 3.0.1了,本節的內容
依次是:

  • Step 1:溫習一波之前幾節涉及到的東西
  • Step 2:程式碼在AS 3.0.1上跑要做一些調整
  • Step 3:編寫一個日誌類

下節我們來說說簽名,混淆,以及釋出到應用市場~
廢話不多說,開始本節內容!


2.程式碼回顧


  • 第一節:專案搭建與簡單實現
    • 1.Git相關的操作
    • 2.簡單的圖片載入類(獲取網路流->轉換成圖片->Handler更新UI)
  • 第二節:解析後臺資料
    • 1.使用Android自帶摳腳Json解析器解析後臺返回的Json資料(Json字串 -> List<Bean>)
    • 2.使用AsyncTask來做非同步網路請求
  • 第三節:圖片載入優化(寫個圖片快取小框架)
    • 1.圖片快取的基本套路
      https://i.iter01.com/images/d1aa4c493742a8b5eec183231de57aad92ab9ffcfa9afe2015ef10e44be12d67.png
    • 2.使用取樣壓縮法壓縮Bitmap,避免OOM
    • 3.執行緒池管理多個圖片載入執行緒
    • 4.Handler更新UI
    • 5.String字串(這裡是URL)轉MD5
    • 6.記憶體快取類LruCache的使用
    • 7.磁碟快取類DiskLruCache的使用
    • 8.整個圖片非同步載入快取的邏輯設計
  • 第四節:新增資料快取(加入SQLite)
    • 1.網路狀態的判斷
    • 2.自定義SQLiteOpenHelper建立資料庫
    • 3.資料庫相關操作:增刪改查,事務,分頁等

以上就是前面四節的內容,對於Android基礎入門中重要的
知識點都進行了運用,如果都掌握了的話,算是勉強Android入門了,
後面的路還長著呢!


3.程式碼調整


AS切換到3.0以後,下述檔案的程式碼需要進行改動,老規矩,切換分支命令走一波:
git checkout -b fix_code_as3.0.1,然後開始程式碼修改:

專案層級的build.gradle

APP層級的build.gradle

gradle-wrapper.properties

還有個地方要小改:SisterApi.java,把福利改成:%e7%a6%8f%e5%88%a9
這涉及到了中文轉碼問題,而HttpUrlConnection無法開啟含有中文的連結,需要
對中文部分呼叫URLEncoder.encode(中文部分,”utf-8”);進行轉碼,記得只是
中文部分,不是整個url!!!轉碼還需要捕獲異常,這裡因為只有一個地方要
轉碼,我就直接用網頁版的轉碼工具來轉碼了:http://tool.chinaz.com/tools/urlencode.aspx
轉換後的結果:

另外還有一些小改,buildToolsVersion 26以上findViewById是不用強轉的
點進去方法看就知道了,用了泛型,所以把findViewById都去掉:

最後覺得執行再我的魅藍E2上效果有點偏差,小調了一下頁面佈局,讓圖片寬度滿屏
然後高度自適應,這裡用到的屬性 android:adjustViewBounds = “true”,就是
寬高按比例縮放;還有把上一步下一步的文字放到strings.xml檔案中,小調邊距:

最後再來看我們的專案執行結果:(嘖嘖,好看的妹子就是養眼):

然後把這個分支合併到develop分支上,這裡我們不用之前merge那種合併套路
而是用rebase來合併,具體過程如下:

git add .
git commit -m "fix code in as3.0"
git checkout develop    # 切換到develop分支
git rebase fix_code_as3.0.1 # 合併分支
git push origin develop # 推送develop到遠端分支
git branch -d fix_code_as3.0.1  # 刪除合併後的本地分支

關於Git還不懂的可以去另一篇文章學習,這裡就不多解釋了:小豬的Git使用總結


4.編寫日誌工具類與崩潰日誌採集類


Log列印日誌相信每一位開發者都不會陌生吧,平時除錯必不可少,
當應用打包給測試測試時。測試反饋應用crash的時候,我們第一件
想到的事就是讓對方提供日誌。說到這個打Log,很多童鞋喜歡隨手
一個Log.e(xxx,xxx),什麼日誌都是Error級別,原因基本是:
紅色比較醒目,哈哈!然後直接把變數的值列印處理啊,或在某個
方法里加上,驗證方法是否執行了等,正式釋出的收記得刪還好,
不記得刪的話簡直是作死。反正之前給上家公司的大佬噴了一頓,
至今記憶猶新!Log的管理非常重要,我們要寫的兩個工具類如下:

  • 1.debug的時候日誌正常列印,release的時候不列印
  • 2.奔潰日誌採集,自己測試或者測試測試倒沒什麼,崩潰了直接把
    手機接你電腦上看看logcat就一清二楚了,但是如果應用裝到了使用者
    手機裡,應用崩潰停止執行了,使用者可不會把日誌發給你,多次崩潰
    還可能導致使用者解除安裝你的APP,所以我們需要在APP崩潰的時候把
    日誌儲存起來,當使用者連線wifi或再次開啟應用時,把這個日誌上傳
    到我們的伺服器,我們這裡只是寫來玩玩的,所以只做本地崩潰日誌採集
    一般都是通過整合第三方的統計工具來進行日誌採集的,比如友盟,Bugly等。

好的,需求就上面的兩點,接著準備開始編寫程式碼,不過在寫程式碼之前
科普關於Log的兩點,可能大部分的童鞋都已經知道了,知道的可以直接跳過:

1) 快速列印Log

開啟設定,依次點選:Live Templates -> AndroidLog把日誌列印的都勾上
你還可以自己在下面的Template text裡編寫模板~

接著隨便程式碼裡鍵入上面的log…一個enter,Log語句就出來了,
TAG直接就是你當前的方法名~


2.關於Log的使用科普

1) 快速列印Log列印命令

開啟Settings,依次點選:Live Templates -> AndroidLog把日誌列印的都勾上
你也可以自己在下面的Template text裡編寫模板~

接著隨便程式碼裡鍵入上面的log…一個enter,Log語句就出來了~

如果你在方法外,鍵入logt,可以直接生成一個對應類名的TAG:

2) Log等級的科普

以前組長開小會的時候曾說過我們除錯時直接Log.e的壞習慣,
不同的Log級別應該列印不同的資訊:

  • Log.vVerbose(冗長)
    開發除錯過程中一些詳細資訊,不該編譯進產品,只在開發階段使用
  • Log.d:Debug(除錯)
    用於除錯的資訊,編譯進產品,執行時關閉。

下面這三種等級進製作為普通除錯資訊使用,這些等級的Log是應用
出現問題時候的重要分析線索,如果隨意使用,會給開發人員分析Bug
帶來不必要的困擾。

  • Log.i:Info(資訊)
    例如一些執行時的狀態資訊,這些狀態資訊在出現問題的時候能提供幫助。
  • Log.w:Warning(警告)
    警告應用出現了異常,但不一定會馬上出現錯誤,需要留意
  • Log.e:Error(錯誤)
    應用出現了錯誤,最需要關注解決的!

3) 編寫日誌工具類

老規矩,先開闢分支:bug_log_catch
這個就非常簡單了,除錯時輸出,正式版時不輸出,利用BuildConfig.Debug
進行判斷即可,程式碼如下:

4) 編寫崩潰日誌採集類

崩潰日誌採集類依賴於ApplicationThread.UncaughtExceptionHandler實現~
當因為程式因為未捕獲的異常即將終止退出時,會使用Thread.UncaughtExceptionHandler
查詢UncaughtExceptionHandler的執行緒,呼叫uncaughtException方法,將執行緒
與異常作為引數傳遞。如果執行緒沒有明確設定UncaughtExceptionHandler,則將
ThreadGroup作為其UncaughtExceptionHandler,然後丟給預設的未捕獲異常
處理程式處理。所以我們只需要實現UncaughtExceptionHandler介面,重寫
uncaughtException方法,來實現我們的自定義處理。我們先來捋一捋邏輯清單:

  • 1.建一個資料夾專門放日誌檔案:需要判斷是儲存卡是否可用,然後判斷檔案
    夾是否存在,不存在則新建資料夾;
  • 2.需要一個把字串寫入檔案的方法
  • 3.崩潰日誌的內容組成:當前的時間,應用版本,裝置資訊,奔潰日誌
  • 4.獲取系統預設的UncaughtException處理器,然後判斷是否為null,不為空
    設定為自定義的UncaughtException,這裡我們用單例
  • 5.最後是應用的重啟,設定1s後重新啟動應用;

大概邏輯就是上面這些,我們一步步講,首先是1,2步:

接著是奔潰日誌,由幾部分組成:先是當前時間

接著是應用版本以及裝置資訊,這裡用一個HashMap來存:

在接著是異常資訊,這個就簡單啦,直接傳異常物件,調printStackTrace即可
最後合到一起就是:

寫入檔案的也解決了,然後是自定義UncaughtExceptionHandler單例以及預設
UncaughtExceptionHandler處理器的獲取,設定為自定義UncaughtExceptionHandler,
還需重寫UncaughtException方法

接著我們把自己處理異常的一整套都寫到一個方法裡,當異常發生了,彈出
一個Toast提示使用者應用要重啟,還有呼叫寫入日誌的方法:

然後重寫的UncaughtException方法做下判斷,是否通過自定義處理了異常,
以及預設的UncaughtExceptionHandler的是否為空,即:異常處理了沒
沒處理,丟給自定義的UncaughtExceptionHandler,如果處理了,重啟應用。

最後加上重啟應用的相關程式碼,大功告成:

到此我們的崩潰日誌採集工具類就編寫完畢了,要啟用他的
話需要在DrySisterApp.java中的onCreate()方法中加上:

弄完想測試下是否生效的話很簡單,手動引發崩潰就好了
比如我在下一步的按鈕裡做除數為0的操作:

應用執行後點選下一步,直接崩潰,開啟內建儲存根目錄看下
有沒有Crash的資料夾,開啟看到我們日誌檔案的話,說明成功:

到此完成,把分支合併到develop上,然後推送到遠端倉庫上:

git add .
git commit -m "add LogUtils and CrashHandler"
git checkout develop    # 切換到develop分支
git rebase bug_log_catch # 合併分支
git push origin develop # 推送develop到遠端分支
git branch -d bug_log_catch  # 刪除合併後的本地分支

5.小結

本節先回顧了下之前寫的程式碼,然後因為切換到AS 3.0上的原因
小調整了一下程式碼,最後還編寫了日誌工具類以及崩潰日誌採集
工具類,麻雀雖小五臟俱全,儘管就是一個小小的圖片顯示程式,
但是也算囊括了大部分的入門知識,下一節就是第一版的完結篇
了,簽名打包混淆,以及釋出到酷安市場了!敬請期待~

程式碼下載

https://github.com/coder-pig/DrySister/tree/develop
歡迎follow,star,覺得有什麼想加進來的可以提下issues!


相關文章