在Android開發的過程中,有哪些坑是值得你放在checklist中警示自己的?
通常我們會將經常遇到的問題、容易犯錯的地方都放在一個checklist中,說說在Android開發過程中有哪些問題值得你放在自己的checklist中。
舉例說明:檢查項:是否調用了類的finalize方法作為釋放與類相關的資源?可能存在問題:類的finalize方法的調用時機由系統而定,不能準確知道調用時機,可能會導致程序在使用過程中的異常。解決方案:將與類釋放資源相關的操作封裝成一個共有方法供外部使用,而不是調用類的finalize方法釋放與類相關的資源。
1導入的類庫需要和項目在同級目錄下,謹防資源文件與類庫中衝突2textviewsetText為int時候,textview的color代碼設置,set/getTextSize 單位問題3json 屬性節點不能有空格4asset下使用第三方字體 xx.ttf 必須都為小寫5listView自定義adapter中復用holder時候,如果view/checkbox等對應不同狀態顯示不同的圖片,切記情況寫全,不然會出現錯亂問題。6做上傳時候記得問問服務端是否限制了上傳文件大小7context/getApplicationContext,視你是否需要涉及到ui時候選擇合適的context8存在復用時候,盡量new對象等操作移到復用之外,以防oom9資料庫操作加鎖10用Activity來顯示出的dialog,popupwindow等控制項需要在Activity關閉時候(之前也給關了)
11toast,判斷是否格式(為空等)封裝
12ui布局在多機型上的測試13new handler時候盡量寫在緊跟其他控制項的獲取之後,防止空指針14context.startActivity();要intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);15針對一些特定的只能為數字的editText 設置軟鍵盤類型為數字,為用戶節省切換這一步驟。edittext.setInputType(EditorInfo.TYPE_CLASS_PHONE);16armeabi-v7a17監聽鍵盤輸入會有兩次:(一次up 一次down)18 不同類型的資源文件最好不要重名,不然會偶爾發現空指針,eclipse會抽,找成另一控制項19AlarmManager PendingIntent 這玩意在miui 不管用。。。。20部分系統 datepickdialog 的onDateSet 執行兩次21fragment startActivityForResult 回調
部分經驗:
1.如果代碼需要做混淆,請注意介面類、介面方法和反射要調的類和方法不要混淆,可以照著Activity等四大組件如何不混淆去做2.資料庫的版本控制好,並且資料庫的周期方法(create、update)不要調用getReadableDatabase或者getWriteableDatabase 方法,因為這些方法會繼續調用onCreate方法造成遞歸調用錯誤3.通話記錄是按手機時間來排序的,所以如果你把時間調到一個很久遠的時間(比如2年以後),那你拿到的第一條記錄永遠是你調到正常時間之前的那個記錄4.子線程不要操作ui,包括但不限於各個view組件、dialog、toast等5.R文件不能生成基本都是xml有錯誤,仔細檢查6.高版本(具體忘了)禁用應用通知時(設置里的勾選),toast也無法顯示,注意不要烏龍了。類似的還有使用安全軟體禁用聯網或者某個組件,導致無法監聽到事件或者無法聯網,也很折磨人7.小米的鬧鐘會間隔5分鐘發出(即本來定於28和29的可能都會在30一起出現),在此周期(5分鐘,實驗得出的,沒有代碼支持)定時的鬧鐘會一起響應。8.service的onstart里的返回值需要注意,如果是默認值(默認值是service被殺系統自動擇機啟動),在內存緊張的手機上會頻繁重啟(一秒十幾次很正常),而如果你還在裡面啟動了某些任務,比如聯網,會浪費很多流量
// 繼續更新一些想起來的
9.圖片資源名稱不要以a開頭,尤其a+數字,比如avator01等,很多情況下會出現顯示不了的情況,大概記得是android自身的資源會使用a開頭來命名,遇到了不妨試試改名,不然真會死人。部分實際遇到的狀況,限於測試機型不多,可能有誤的地方請指出。謝邀。吃完午飯遛彎回來,購得豬肉脯牛肉乾若干,一邊吃一邊寫。
- TextView(往往 TextView 派生子類同樣適用)調用 setText 方法設置一個 int 型的數據,千萬要將該值轉為 String,否則在某些設備中它會默認去查詢 R 文件中定義的資源。
- 使用友盟分享 SDK,需要執行分享的 Activity 請不要為該 Activity 設置
android:process
屬性。比如你的 App 運行在 com.codingfish.test 進程,需要產生分享動作的Activity 設置 android:proces=":com.codingfish.hello" ,那麼新浪微博就會出現你設置的分享內容沒有顯示的問題。該 Bug 已經提交給友盟的技術人員,但是 N 久沒有得到修復。
- 上線之前一定要使用正式簽名打包。某朋友公司 Android 的應用上架之前,負責打包上線的童鞋(新人,老人已離職,只有這一個Android)沒有簽名的概念,直接將 Debug 簽名的 Apk 投放到渠道了,到現在還有一批設備沒有替換回來。
- 在 Activity 中儘可能少的創建 Handler 對象,創建一個主線程 Handler,一個後台 HandlerThread 就可以了。
- 使用 BitMap 之後,一定要記得釋放。
- 使用線程的地方盡量不要 new Thread,而是使用 AsyncThread 。
onCreate(Bundle savedInstanceState)
切記將
super.onCreate(savedInstanceState);
放在一切業務的前面。
- 創建了四大組件一定記得要在 AndroidManifest 文件中聲明(當然 BroadcastReceiver 可以動態註冊)。
===========寫著寫著就寫成了應該注意的事項了,自己汗一個,挖個坑,找個時間再寫。=============
剛才 Google 了一下,有一篇文章介紹的不錯,肥肥做了一次伸手黨,直接複製過來了。
原文鏈接: Android生存指南之:開發中的注意事項_Android_腳本之家1. 為Activity聲明系統配置變更事件 系統配置變更事件是指轉屏,區域語言發生變化,屏幕尺寸發生變化等等,如果Activity沒有聲明處理這些事件,發生事件時,系統會把Activity殺掉然後重啟,並嘗試恢復狀態,Activity有機會通過onSaveInstanceState()保存一些基本數據到Bundle中,然後此Bundle會在Activity的onCreate()中傳遞過去。雖然這貌似正常,但是這會引發問題,因為很多其他的東西比如Dialog等是要依賴於具體Activity實例的。所以這種系統默認行為通常都不是我們想要的。
為了避免這些系統默認行為,就需要為Activity聲明這些配置,如下二個是每個Activity必須聲明的:
&幾乎所有的Activity都要聲明如上,為什麼Android不把它們變成Default的呢?2. 盡量使用Android的API 這好像是廢話,在Android上面開發不用Android API用什麼?因為Android幾乎支持Java SE所有的API,所以有很多地方Android API與Java SE的API會有重複的地方,比如說對於文件的操作最好使用Android裡面Context封裝的API,而不要直接使用File對象:
Context.openFileOutput(String); // no File file = new File(String)原因就是API裡面會考慮到Android平台本身的特性;再如,少用Thread,而多使用AsyncTask等。3. 要考慮到Activity和進程被殺掉的情況 如了通常情況退出Activity外,還有Activity因其他原因被殺的情況,比如系統內存過低,系統配置變更,有異常等等,要考慮和測試這種情況,特別是Activity處理重要的數據時,做好的數據的保存。
4. 小心多語言 有些語言真的很啰嗦,中文或英文很簡短就能表達的事情到了其他語言就變的死長死長的,所以如果是wrap_content就可能把其他控制擠出可視範圍; 如果是指定長度就可能顯示不全。也要注意特殊語言比如那些從右向左讀的語言。
5. 不要用四大組件去實現介面 一是組件的對象都比較大,實現介面比較浪費,而且讓代碼更不易讀和理解; 另外更重要的是導致多方引用,可能會引發內存泄露。
6. 用getApplication()來取Context當參數 對於需要使用Context對象作為參數的函數,要使用getApplication()獲取Context對象當參數,而不要使用this,除非你需要特定的組件實例!getApplication()返回的Context是屬於Application的,它會在整個應用的生命周期內存在,遠大於某個組件的生命周期,所以即使某個引用長期持有Context對象也不會引發內存泄露。
7. 主線程只做UI控制和Frameworks回調相關的事。附屬線程只做費時的後台操作。交互只通過Handler。這樣就可以避免大量的線程問題。
8. Frameworks的回調不要做太多事情僅做必要的初始化,其他不是很重要的事情可以放到其他線程中去做,或者用Handler Schedule到稍後再做。
9. 要考慮多解析度 至少為hdpi, mdpi, ldpi準備圖片和布局。元素的單位也儘可能的使用dip而不要用px。
10. 利用Android手機的硬鍵 幾乎所有的Android手機都有BACK和MENU,它們的作用是返回和彈出菜單,所以就不要再在UI中設計返回按扭和菜單按扭。很多優秀的應用如隨手記和微信都有返回鍵,他們之所以有是因為他們都是從iOS上移植過來的,為了保存體驗的一致,所以也有了返回和菜單。但這不夠Android化,一個純正的Android是沒有必須重複硬鍵的功能的。在網上沒有搜索到想要的答案,來知乎提問,答案也比較少,索性自問自答一下,盼各位android開發大拿拿出自己積攢的經驗,方便初入這行的小夥伴知道該避免那些常見問題、哪些地方容易出錯、哪些坑不能踩。。。
PS:下面這些CheckList項有些是憑經驗所得,沒有科學依據,再加上個人能力有限,如果有疑問或者異議請在評論區裡面拍磚。
不要覺得這個Activity裡面只有一個網路請求就邏輯混亂的隨便寫(覺得反正代碼很短應該沒什麼維護成本),老老實實去用MVP架構,等到需求變了之後,功能增多了你就會發現遵循MVP是多麼易於維護。
列一些開發過程中容易耽誤時間,或者會在市場上發布後引起很多坑的點,隨時補充:
- 修改資料庫相關欄位和邏輯以後,務必要測試升級的情況是否有問題
- 添加系統相關屬性如何都調試不通,想想是否對應許可權沒有添加
- 生成的bitmap在使用完成後務必回收
- 部分sdk需要簽名功能才會生效,不要在這裡浪費太多時間,例如微信第三方登錄
- 所有的圖片務必先用http://tinypng.com壓一遍
- 務必考慮像在魅族這種實現了smartbar的特殊機型上的適配問題
- 一些華為機器log和Toast列印一直異常,不要在這上面耽誤時間
- 跟開發無關,但是app新版本上線後,第一時間關注應用市場和後台錯誤率統計,往往能及時補上自己埋下的坑
- .......
launcher activity不要用singleTask,不然返回桌面再點擊圖標進入,顯示的永遠都是那個launcher activity
放下Eclipse,轉到Android Studio
個人觀點,只有「內存問題」是需要列 checklist 來仔細執行的,剩下能 crash 的問題都不是問題。所以……Lifecycle! Lifecycle! Lifecycle! 很重要所以說三遍。理解了 Lifecycle 就是個合格的 Android 研發工程汪了喵~
- 避免 Lifecycle 對象 (四大組件) 的引用被 Lifecycle 無關對象 (單例) 持有,這往往會造成內存問題
- 各種 Adapter 跟著 View 的 Lifecycle 創建和銷毀 (onViewCreated/onDestroyView),跟著 Controller 一般會導致 Adapter 內部的 Observer 引用到 AdapterView/RecyclerView 而泄漏 View 內存 (Fragment 的 Lifecycle 中比較明顯)
- 引入第三方介面 (特別是各種 SDK) 的時候盡量使用 ApplicationContext,因為這些 SDK 的創建者大都無視 Lifecycle……
剩下的…… (也許叫 Best Practice 比較好)
- 實現 Parcelable (有點辛苦,卻是值得的)
- 實現 onSaveInstanceState/onRestoreInstanceState,丟狀態的 App 很讓用戶抓狂的 (使用「開發者選項-&>不保留活動」測試)
- 有 id 的 View 會自動保存和恢復狀態,沒有 id 的則不會
- 使用單例持有 Lifecycle 對象的時候使用 WeakReference
- 透過支持 Lifecycle 控制的框架使用多線程
哦對,還有 WebView……
- WebView 默認並不啟用 JavaScript
- WebView 需要額外的工作來支持 HTML5 Video
- 謹慎使用 addJavascriptInterface,WebView 在 Android &< 4.2 上有反射漏洞
關於適配…… 又是另一個 checklist 了。
最近遇到一個坑,特別想一吐為快,那就是有的手機遇到這樣的一句話時
System.out.println(null);
會閃退
閃退退最可怕的是開發者的手機不閃退,用戶的手機閃退。「冷靜,這是15:9的flyme」當你適配某機型的時候說到。
12年入坑 剛開始編碼的時候 自己維護的android入坑集錦. 只要是被坑過然後解決的 都會記錄,現在懶了.都不記了,看到這些小夥伴分享的筆記真的很懷念
setselection()
【CardView】1.xml中使用CardView要用全稱(當然,你要先導入庫),包名是什麼我忘了。。好像是V7包2.要加 app:cardPreventCornerOverlap="true"app:cardUseCompatPadding="true"屬性,否則AndroidL以上和L以下的版本顯示的padding不一致
我把一張普通的索引圖經過各種無損壓縮後轉成灰度圖,pc上預覽沒問題,ps顯示也沒問題,結果編譯工具鏈中appt調用的libpng表示無法識別,然後只能流淚點擊revert~~~
推薦閱讀:
※Android studio的工程默認繼承AppcompatActivity類和Activity不同?
※2016 年第一季度,Android 有什麼讓人興奮的新技術出現嗎?
※如何評價OPPO R9S升級後標識錯誤的Android版本號事件?
※如何評價 Android M?
※iOS 的應用質量具體在哪些方面高於安卓應用?
TAG:Android開發 |