剛接觸Android,做項目的時候遇到了很多問題,有些是不知道安卓本身就有這個功能,有些是對於一些問題的處理沒有經驗。下面這些問題有的是自己在工作中遇到的,有些是身邊同事遇到的,分析不一定是對的,但是在項目中這些問題就是按下面所描述的來處理的,現在寫出來做下記錄,方便自己,方便他人。
1、為了提升進模塊的速度,在主入口的onCreate方法里面做的工作越少越好,盡量只做與更新UI相關的工作,其它的工作延后處理,像判斷是否為第一次進入模塊這種不能延后處理的,應該考慮程序的運行效率,可以通過判斷這個文件是否存在的方式來判斷是否為第一次進入,因為第一次進入模塊時,保存進模塊記錄的配置文件是一個從無到有的過程,判斷文件是否存在的效率會優於讀取文件的效率。
2、libproject不能直接進行單元測試,可以借助於對調用該project的工程進行單元測試來測試libproject。
3、Eclipse中出現如下圖所示不明字符時,在Window->Preferences->General->Editors->Text Editors->去掉show whitespace characters然后Apply就可以了。
4、保存配置文件的操作最好在onPause()方法完成,不要在onDestory()和onStop()方法中實現;具體可以參考android官方例程中的NotePad,它保存文件都是在onPause方法中實現的,關於Activity在各種情況下的回調方法的調用關系,可以看一下下面這兩篇文章:
(1)Android-Activity詳解與匯總:http://www.cnblogs.com/TseChiHoi/archive/2012/08/30/2664221.html
(2)Android Activity類應用技巧分享:http://yangguangfu.iteye.com/blog/677240
5、完全退出一個進程需要一定的時間,在結束一個進程時,需要處理在退出后又快速進入這個進程的情況,還有需要確保在Activity onDestory的結束動畫播完之后再調用結束進程的方法,不然會出現屏閃的情況,建議在退出進程時做類似於如下處理方式的處理:
6、對於靜態類或者單例模式的類,應該將構造函數私有化,禁止外部將其實例化。安卓源碼中很多靜態類都做了類似的處理,比如TextUtils:
7、使用StarUML對代碼進行逆向轉換成類圖時,StarUML對於代碼中有的符號不識別會導致相應的類逆向失敗,比如“<”,將這些不識別的符號替換掉或者刪除逆向才能成功。
8、在初始化ViewPager時,應先給Adapter初始化內容后再將該adapter傳給ViewPager,如果不這樣處理,在更新adapter的內容后,應該調用一下adapter的notifyDataSetChanged方法,否則在ADT22以上使用會報The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged的異常,具體原因可參考:http://stackoverflow.com/questions/16756131/fragmentstatepageradapter-stopped-working-after-updating-to-adt-22
9、自定義控件時,在onDraw和move方法里面不能做過多的工作,和小系統相比,安卓的畫圖操作效率本來就不怎么高,對於這種頻繁更新視圖的方法里,一是要精簡代碼,二是要減小刷新區域。在寫描紅控件的過程中,從數據中取出來的每個字的字模都是成千上萬個點的信息,這種顯然不能在onDraw里直接操作,可以通過為畫布設置一張圖片,然后將點信息存放在畫布上,在onDraw方法里只需要顯示為這塊畫布設置的圖片就可以了,具體操作類似於如下代碼:
10、在退出使用ViewPager的界面時,記得在退出之前調用其removeAllViews方法,避免頻繁進出該界面時內存不斷上漲;
11、對於單個應用占用內存較多容易導致內存不足時,可以考慮按功能將該application的各界面分成多個進程來處理,從而分擔主進程的內存壓力。但是要記住一點,進程之間是不共享數據的。
12、當有多個屬性決定排序的情況時,可以考慮將各個屬性數值化,然后按照各參數的優先級對各個參數划分成不同的數量級,最終將每個需要排序的項的各個屬性轉化成一個待排序的數據(權值),排序只針對這個數值進行排序,就不用在排序的時候考慮那些復雜的規則了,這樣在需求有變動時也好處理,只需要根據排序的規則為不同的屬性值調整優先級,不需要修改排序的算法了。
13、在自定義控件時,三個構造函數都要定義,這樣無論在xml文件還是在代碼中都能正常使用了,如果只定義僅帶Context的構造函數,會導致該控件在xml文件中使用時程序運行時異常。
14、在一個類里建議最多使用兩個線程(在一本書上看到的,具體哪本搞忘了),線程太多了太難管理了,過多的線程時,只要稍管理不到位,就會出現很多隨機問題,用線程鎖也會有效率的問題。
15、對於一個類,需要滿足不同的需求時,在初始化時,需要接收的入參也不一樣,一般都是通過重載初始化的方法來滿足各個調用者的需求,為了簡化代碼,可以考慮構建器來實現這種多個可選參數的情況,具體可以參考《Effective Java》一書的第二條“遇到多個構造器參數時要考慮用構建器”或者android源碼中的AlertDialog類,它通過構建一個內部靜態類Builder來降低代碼的冗余。
如果你覺得上面的這些沒啥營養,那就給你推薦點有營養的吧:
1、資源檢索:百度網盤真的很不錯,只要有一個百度賬號,下載電子書什么的都是免費的。這個搜索引擎可以搜索出多數你需要的資源:http://so.baiduyun.me/
順便分享一下我在百度網盤的資源,幾十G的電子書:http://pan.baidu.com/share/link?shareid=249850146&uk=973539797
這些書有些我還是在看的,不要說我只會屯資源。大家也可以注冊一個玩玩,挺方便的。
2、資源:
(1) Android開發者必知的開發資源: http://www.importnew.com/3988.html
(2)(不斷更新)每個程序員都應該知道的那些事兒: http://geek.csdn.net/news/detail/1566
(3) Junit測試驅動開發: http://wenku.baidu.com/course/view/d9d776a20029bd64783e2c00
(4) ANT使用全攻略: http://wenku.baidu.com/course/view/dd2cbd64783e0912a2162a00
(5) stack overflow: http://stackoverflow.com/
(6) mobile tuts+: http://mobile.tutsplus.com/category/tutorials/android/
(7)《The Busy Coder's Guide to Android Development》: http://pan.baidu.com/share/link?shareid=525553&uk=3810048654
(8) 直接拿來用!最火的Android開源項目(完結篇): http://www.csdn.net/article/2013-05-21/2815370-Android-open-source-projects-finale/1
(9) InfoQ: http://www.infoq.com/cn/
3、工具:
(1)快捷鍵管理工具Auto HotKey,找目錄、開軟件不用老用鼠標點來點去了:
(2)如果你還想進一步提高你的工作效率,推薦使用Total Commander,不過這需要一定的學習成本,需要學習一段時間才能熟練使用,我嘗試兩三次了,現在只能做一些基本的操作。