轉載自:http://mp.weixin.qq.com/s?__biz=MzA4MjU5NTY0NA==&mid=404388098&idx=1&sn=8bbbba7692dca68cdda2212dec4d86c0&scene=21#wechat_redirect
今天是馮建同學投稿,總結他在Android開發方面的各種小經驗,我覺得非常有意義,所謂經驗豐富有時候是指積累的這些小經驗非常多,他這篇分享相信會幫助到一些朋友。我也曾推薦過他的 APK魔鬼瘦身 一文,沒看過的朋友也可以再去看看。
做Android久了,就會踩很多坑,被坑得多了就有經驗了,閒暇之餘整理了部分,現挑選一些重要或者偏門的“小”經驗做個記錄。
查看SQLite日誌
因爲實現裏用了Log.isLoggable(TAG, Log.VERBOSE)做了判斷,在LessCode的LogLess中也參考了這種機制:https://github.com/openproject/LessCode/blob/master/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java
使用這種方法就可以在Release版本也能做到查看應用的打印日誌了。
PNG優化
APK打包會自動對PNG進行無損壓縮,如果自行無損壓縮是無效的。
當然進行有損壓縮是可以的:https://tinypng.com/
Tcpdump抓包
有些模擬器比如genymotion自帶了tcpdump,如果沒有的話,需要下載tcpdump:
http://www.strazzere.com/android/tcpdump
把tcpdump push到/data/local下,抓包命令:
查看簽名
很多開發者服務都需要綁定簽名信息,用下面的命令可以查看簽名:
注意,這個是需要密碼的,可以查看MD5, SHA1,SHA256等等。
單例模式(懶漢式)的最佳寫法
特別說到這個問題,是因爲網上很多這樣的代碼:
這種寫法線程不安全,改進一下,加一個同步鎖:
網上這樣的代碼更多,可以很好的工作,但是缺點是效率低。
實際上,早在JDK1.5就引入volatile關鍵字,所以又有了一種更好的雙重校驗鎖寫法:
這纔是最佳寫法!!!
不是說第二種寫法有問題,或者在Android中一定要用第三種寫法,只是告訴大家一種更好的寫法。
多進程Application
是不是經常發現Application裏的方法執行了多次?百思不得其解。
因爲當有多個進程的時候,Application會執行多次,可以通過pid來判斷那些方法只執行一次,避免浪費資源。
隱式啓動Service
這是Android5.0的一個改動,不支持隱式的Service調用。下面的代碼在Android 5.0+上會報錯:Service Intent must be explicit:
可改成如下:
fill_parent的壽命
在Android2.2之後,支持使用match_parent。你的佈局文件裏是不是既有fill_parent和match_parent顯得很亂?
如果你現在的minSdkVersion是8+的話,就可以忽略fill_parent,統一使用match_parent了,否則請使用fill_parent。
ListView的局部刷新
有的列表可能notifyDataSetChanged()代價有點高,最好能局部刷新。
局部刷新的重點是,找到要更新的那項的View,然後再根據業務邏輯更新數據即可。
強調一下,最後那個列表數據別忘記更新, 不然數據源不變,一滾動可能又還原了。
系統日誌中幾個重要的TAG
一行居中,多行居左的TextView
這個一般用於提示信息對話框,如果文字是一行就居中,多行就居左。
在TextView外套一層wrap_content的ViewGroup即可簡單實現:
setCompoundDrawablesWithIntrinsicBounds()
網上一大堆setCompoundDrawables()方法無效不顯示的問題,然後解決方法是setBounds,需要計算大小…
不用這麼麻煩,用setCompoundDrawablesWithIntrinsicBounds()這個方法最簡單!
計算程序運行時間
爲了計算一段代碼運行時間,一般的做法是,在代碼的前面加個startTime,在代碼的後面把當前時間減去startTime,這個時間差就是運行時間。
這裏提供一種寫起來更方便的方法,完全無時間邏輯,只是加一個打印log就夠了。
沒有計算時間的邏輯,這能測出來?
把日誌過濾出來,運行命令“adb logcat -v time | grep TAG”:
通過-v time參數,可以比較日誌左邊的時間來算出中間的代碼運行的時間。
Java引用類型一覽表
Context使用場景
爲了防止Activity,Service等這樣的Context泄漏於一些生命週期更長的對象,可以使用生命週期更長的ApplicationContext,但是不是所有的Context的都能替換爲ApplicationContext
這是網上流傳的一份表格:
圖片緩存大小
現在很多圖片庫需要給圖片設置一個最大緩存,但是這個值設置多少合適呢?
高端機和低端機的配置顯然應該不同,可以考慮設置一個動態值。
建議設置爲應用可用內存的1/8:
系統內置的一些工具類
在AOSP源碼全局搜了一下包含Util關鍵字的類,整理出這個列表供大家參考:
這麼多工具類,一定可以找到對你有用的。
ClipPadding
這個不多說,ListView的ClipPadding設爲false,就能爲ListView設置各種padding而不會出現醜陋的滑動“禁區”了。
強大的dumpsys
dumpsys可以查看系統服務和狀態,非常強大,可通過如下查看所有支持的子命令:
這裏列舉幾個稍微常用的:
bugreport命令
很多人都用過adb logcat,但是如果想要更詳細的信息,logcat則無能爲力。
所以大多數手機廠商測試更多的是用adb bugreport來抓log給開發人員分析。
dpi文件夾的換算比例
更新媒體庫文件
以前做ROM的時候經常碰到一些第三方軟件(某音樂APP)下載了新文件或刪除文件之後,但是媒體庫並沒有更新,因爲這個是需要第三方軟件主動觸發。
媒體庫會在手機啓動,SD卡插拔的情況下進行全盤掃描,不是實時的而且代價比較大,所以單個文件的刷新很有必要。
Monkey參數
大家都知道,跑monkey的參數設置有一些要注意的地方,比如太快了不行不切實際,太慢了也不行等等,這裏給出一個參考:
一邊跑monkey,一遍抓log吧。
小結
無論是大經驗還是小經驗,都是好經驗,關鍵時候出奇效。