編輯:關於android開發
作者:張明雲
原標題:Android 開發中,有哪些坑需要注意?
作者github主頁:zmywly8866.github.io/
在Android library中不能使用switch-case語句訪問資源ID:在Android library中不能使用switch-case語句訪問資源ID的原因分析及解決方案
不能在Activity沒有完全顯示時顯示PopupWindow和Dialog:popupwindow - Problems creating a Popup Window in Android Activit
在多進程之間不要用SharedPreferences共享數據,雖然可以(MODE_MULTI_PROCESS),但極不穩定:android - MODE_MULTI_PROCESS for SharedPreferences isn't working
有些時候不能使用Application的Context,不然會報錯(比如啟動Activity,顯示Dialog等):
同一個應用的JNI代碼,不要輕易換NDK編譯的版本,否則會有很多問題(主要是一些方法實現不一樣,並且高版本對代碼的檢測更嚴格),比如r8沒有問題,但到r9就有問題了,這是個大坑;
Android的JNI代碼中,有返回類型的函數沒有返回值編譯的時候也不會報錯;
當前Activity的onPause方法執行結束後才會執行下一個Activity的onCreate方法,所以在onPause方法中不適合做耗時較長的工作,這會影響到頁面之間的跳轉效率;
謹慎使用Android的透明主題,透明主題會導致很多問題,比如:如果新的Activity采用了透明主題,那麼當前Activity的onStop方法不會被調用;在設置為透明主題的Activity界面按Home鍵時,可能會導致刷屏不干淨的問題;進入主題為透明主題的界面會有明顯的延時感;
不要在非UI線程中初始化ViewStub,否則會返回null;
公共接口一定要考慮到代碼重入的情況,能設計為單例就盡量用單例;
不要通過Bundle傳遞大塊的數據,否則會報TransactionTooLargeException異常:java - Issue: Passing large data to second Activity
盡量不要通過Application緩存數據,這不穩定:不要在Android的Application對象中緩存數據!
盡量不要使用AnimationDrawable,它在初始化的時候就將所有圖片加載到內存中,特別占內存,並且還不能釋放,釋放之後下次進入再次加載時會報錯;
9圖不能通過tinypng壓縮,不然會有問題;
genymotion模擬器快是因為它是基於x86架構的,如果你的應用中用到了so,但沒有x86架構的so,只能放棄使用它;Android Studio的模擬器也一樣;
Android studio每個版本、gradle每個版本差別都比較大(我是這樣認為的),對於jni代碼的編譯建議在Eclipse中進行,如果在Android studio中開發jni會浪費很多時間,主要是編譯腳本的配置比較麻煩;
Eclipse中的Lint太不靠譜,特別是主工程中依賴library的時候,很多提示都是有問題的,建議使用Android Studio的工程清理工具,特別推薦;
不同API版本的AsyncTask實現不一樣,有的是可以同時執行多個任務,有的API中只能同時執行一個線程,所以在程序中同時執行多個AsyncTask時有可能遇到一個AsyncTask的excute方法後很久都沒有執行。調用AsyncTask的excute方法不能立即執行程序的原因分析及改善方案
同一個應用,相同的圖片分別放在drawable-xxhdpi、drawable-xhdpi、drawable-hdpi、drawable-mdpi、drawable-ldpi中,在同一設備中占用的內存會大不一樣(設備的dpi是固定的,圖片放在不同的dpi文件夾下,在設備上顯示時需要將圖片轉換成和當前屏幕一樣dpi後在設備中顯示,所以即使該圖片在不同dpi文件夾下大小一樣,但放在內存中的大小卻不是一樣的,並不一定是長*寬*4),做應用的內存優化之前可以先看一看你的工程是如何做屏幕適配的,是否有優化的空間。強烈推薦這個屏幕適配視頻教程,花兩個半小時就能看完:Android-屏幕適配全攻略
謹慎對待數據庫升級(比如需要在原數據庫中增加字段),避免數據丟失或者操作數據庫異常的情況,數據庫升級方法可以查閱《第一行代碼》P263;
多個程序共用一套代碼(一套代碼,在桌面上多個圖標)時需要處理好不同入口進入時的堆棧問題;
使用Adapter的時候,如果你使用了ViewHolder做緩存,在getView的方法中無論這項的每個視圖是否需要設置屬性(比如TextView設置的屬性可能為null,item的某一個按鈕的背景為透明、某一項的顏色為透明等),都需要為每一項的所有視圖設置屬性(textview的屬性為空也需要設置setText(""),背景透明也需要設置),否則在滑動的過程中會出現內容的顯示錯亂。
謹慎使用Android的多進程,多進程雖然能夠降低主進程的內存壓力,但會遇到如下問題:(1)不能實現完全退出所有Activity的功能(如果有同行在應用內采用多進程成功實現過完全退出程序歡迎溝通交流);(2)首次進入新啟動進程的頁面時會有延時的現象(有可能黑屏、白屏幾秒,是白屏還是黑屏和新Activity的主題有關);(3)應用內多進程時,新啟動一個進程都會重新跑一次Application的onCreate方法,不上重新創建一個Application,但會重新跑Application的onCreate,這樣就不能在Application中緩存數據作為內存共享的途徑了;(4)多進程間通過SharedPreferences共享數據時不穩定,具體可以查閱《Android開發藝術探索》。
使用Toast時,建議定義一個全局的Toast對象,這樣可以避免連續顯示Toast時不能取消上一次Toast消息的情況(如果你有連續彈出Toast的情況,避免使用Toast.makeText);
關於更多Android開發方面的文章,可以看看我的專欄:張明雲的知識共享 - 知乎專欄
知識面有限,有很多沒有深入理解的知識點,歡迎指正交流~~~
著作權歸作者所有。
商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
作者:張明雲
鏈接:http://www.zhihu.com/question/27818921/answer/70279930
來源:知乎
第三方開源框架的下拉刷新列表(QQ比較常用的)。,開源框架PullToRefreshListView是第三方開源框架下拉刷新列表,比較流行的QQ 微信等上面都在用。 下載
Android項目使用Dagger2進行依賴注入 原文鏈接:http://code.tutsplus.com/tutorials/dependency-injecti
聯系人分組標簽懸停滑入滑出的實現方法。,標簽懸停《類似通訊錄分組的Android PinnedSectionListView,分組標簽懸停滑入滑出》 常用的聯系人、通訊錄
Android Theme and style 每家公司的app都有自己的統一的特色,這就涉及到theme和style,當然他們只不是僅僅為了這個特點存在,想activi