良心推薦:總結Android開發(fā)中必備的代碼Review清單

前言

本文收集了我自己工作以來提交代碼前的所有檢查點。事實證明,這樣能有效提高自己的代碼質量和功能的穩(wěn)定性。所以推薦大家以后每次提交代碼前沾凄,都可以看下這份Review清單哈。

此外知允,可能還有些檢查點我并沒有發(fā)現(xiàn)撒蟀,歡迎大家踴躍在評論區(qū)補充哈~


清理操作

1.頁面退出時,是否完成必要的清理操作

  1. 是否調用Handler的removeCallbacksAndMessages(null)來清空Handler里的消息温鸽;
  2. 是否取消了還沒完成的請求保屯;
  3. 在頁面里注冊的監(jiān)聽,是否反注冊嗤朴;
  4. 假如自己用到觀察者模式,是否反注冊虫溜;
  5. 假如用了RxJava的話雹姊,是否解除訂閱;

2.數(shù)據(jù)庫的游標是否已經(jīng)關閉
這個點一般人都知道衡楞,出問題一般在于吱雏,沒有考慮到多線程并發(fā)時的情況下敦姻,Cursor沒有被釋放。
所以數(shù)據(jù)庫的操作需要加上同步代碼塊
詳細可參考:http://www.2cto.com/kf/201408/329574.html

3.打開過的文件流是否關閉

4.Android 3.0以下的版本歧杏,使用完的Bitmap是否調用recycle()镰惦,否則會一直占用內存
而Android 3.0及以上的版本不需要調用recycle(),因為這些版本的Bitmap全部放到虛擬機的堆內存中犬绒,讓GC自動回收旺入。

5.WebView使用完是否調用了其destory()函數(shù)


是否能進一步優(yōu)化自己的代碼

1.保存在內存中的圖片,是否做過壓縮處理再保存在內存里
否則可能由于圖片質量太高凯力,導致OOM

2.Intent傳遞的數(shù)據(jù)太大茵瘾,會導致頁面跳轉過慢。太大的數(shù)據(jù)可以通過持久化的形式傳遞咐鹤,例如讀寫文件

3.頻繁地操作同一個文件或者執(zhí)行同一個數(shù)據(jù)庫操作拗秘,是否考慮把它用靜態(tài)變量或者局部變量的形式緩存在內存里。用空間換時間

4.放在主頁面的控件祈惶,是否可以考慮用ViewStub來優(yōu)化啟動速度


要小心第三方包

1.build.gradle遠程依賴第三方包時雕旨,版本號建議寫死,不要使用+號
避免由于新版本的第三方包引入了新的問題

2.導入第三方工程時捧请,記得把編碼轉換成自己工程當前是用的編碼

3.調用第三方的包或者JDK的方法時凡涩,要跳進他們的源碼,看要不要加 try-catch
否則可能會導致自己應用的崩潰

4.使用第三方包時血久,是否加上其混淆規(guī)則
若漏掉加上第三方包的混淆規(guī)則突照,會導致第三方包不該混淆的代碼被混淆。在Debug版本沒有發(fā)現(xiàn)問題氧吐,但是Release版本就會出現(xiàn)問題

5.系統(tǒng)應用添加so時讹蘑,是否在固件對應的Android.mk文件上加入新增的so,否則系統(tǒng)可能編譯不過

@lib/armeabi/libcommon.so \
@lib/armeabi/libabcdefg.so \

注意要成對出現(xiàn)的地方

1.系統(tǒng)的筑舅、自己寫的座慰,注冊和反注冊的方法,是否成對出現(xiàn)

2.在生命周期的回調里翠拣,創(chuàng)建和銷毀的代碼是否對應起來
比如:onCreate()里面創(chuàng)建了Adapter版仔,那么對應Adapter的退出處理操作(比如清空Image緩存),一般就要寫在onDestory()误墓,而不能寫在onDestoryView()蛮粮。

類似的生命周期對應的代碼有:
onStart()、onStop();
onCreate()谜慌、onDestory();
onResume()然想、onPause();
onCreateView()、onDestoryView()

3.若ListView的item復用了欣范,對Item里View的操作是否成對出現(xiàn)
比如:

switch (type) {
    case ArticleListItem.TYPE_AD:
        ......
        mTitleView.setText(tencentAdBean.title);
        mGreenLabelView.setVisibility(VISIBLE);
        mRedLabelView.setText("");
        mRedLabelView.setVisibility(GONE);
        break;
    case ArticleListItem.TYPE_ARTICLE:
        ......
        mTitleView.setText(mzAdBean.adData.getTitle());
        mGreenLabelView.setVisibility(GONE);
        mRedLabelView.setText("ABC");
        mRedLabelView.setVisibility(VISIBLE);
        break;
}

比如以上對mTitleView变泄、mGreenLabelView和mRedLabelView的操作令哟,都是成對出現(xiàn)。否則ListView可能會由于Item復用妨蛹,導致Item顯示錯亂問題


防內存泄漏

1.內部類屏富,比如Handler、Listener蛙卤、Callback是否是成static class
因為非靜態(tài)內部類會持有外部類的引用狠半。

2.假如子線程持有了Activity,要用弱引用來持有
比如Request的Activity就應該用弱引用的形式表窘,防止內存泄漏典予。

3.要求傳入Activity作為參數(shù)的函數(shù),是否可以改用getApplicationContext()來作為參數(shù)


Handler相關

1.使用View.post()是否會有問題
因為在View處于detached狀態(tài)期間乐严,post()里面的Runnable是不會被執(zhí)行的瘤袖。只有在此View處于attached狀態(tài)時才會被執(zhí)行。

如果想改Runnable每次肯定會被執(zhí)行昂验,那么應該是用Handler.post來替代

2.假如程序可能多次在同一個Handler里post同一個Runnable捂敌,每次post之前都應該先清空這個Handler中還沒執(zhí)行的該Runnable
如:

if (mCloudRun != null) {
    mHandler.removeCallbacks(mCloudRun);
    mCloudRun = null;
}
mCloudRun = new Runnable() {
    @Override
    public void run() {
        CloudAccelerateSwitchRequest request = new CloudAccelerateSwitchRequest();
        request.setPriority(RequestTask.PRIORITY_LOW);
        RequestQueue.getInstance().addRequest(request);
    }
};
mHandler.post(mCloudRun);   

其他

1.多思考某些情況下,某變量是否會為空
而且在函數(shù)體內既琴,處理參數(shù)前占婉,必須加上判空語句

2.回調函數(shù)是否處理好
回調函數(shù)很容易出問題。比如網(wǎng)絡請求的回調甫恩,需要判斷此時的Aciivity等是否還存在逆济,再進行調用。因為異步操作回來磺箕,Activity可能就消失不存在了奖慌。
而且還要對一些可能被回收的變量進行判空。

3.修改數(shù)據(jù)庫后松靡,是否把數(shù)據(jù)庫的版本號+1

4.啟動第三方的Activity時简僧,是否判斷了該Intent能否被解析

Intent sendIntent = new Intent(mContext, Demo.class);
// 這種方式判斷是否存在
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(sendIntent);
}

若Activity不存在,會出現(xiàn)ActivityNotFoundException的異常

5.新注冊的Activity雕欺、Service或Provider岛马,若AndroidManifest.xml中exported屬性為true,要考慮是否會引發(fā)安全性問題

<activity android:name="com.inkenka.DemoActivity"
            android:exported="true"/>

因為exported屬性為true時屠列,外部應用就可以直接調用起該Activity啦逆。
可能導致的問題:
1)若外部應用直接啟動詳情頁,從而讓某些驗證頁面直接被繞過
2)若外部應用給該Activity傳遞亂七八糟的Intent笛洛,可能讓該應用崩潰夏志。也就是Android中的拒絕服務漏洞

5.除數(shù)是否做了非0判斷

6.不要在Activity的onCreate里調用PopupWindow的showAsLoaction方法,由于Activity還沒被加載完撞蜂,會報錯


功能完成后盲镶,自測時的檢查點

1.思考某些情況下,某個變量是否會造成空指針問題

2.把手機橫屏蝌诡,檢查布局是否有Bug

3.在不同分辨率的機型上溉贿,檢查布局是否有Bug

4.切換到英文等外文字體下,檢查外文是否能完整顯示

5.從低版本升級上來浦旱,會不會有問題
比如可能會出現(xiàn)數(shù)據(jù)庫不兼容的問題

6.按下Home再返回是否正常

7.熄滅屏幕再打開是否正常

8.切換成其它應用再切換回來會怎樣

9.利用手機的開發(fā)者選項中的 “調試GPU過度繪制” 宇色,“GPU呈現(xiàn)模式分析” 和 “顯示FPS和功耗” 功能,看自己的新功能是否會導致過度繪制颁湖、是否會掉幀

10.測試看是否影響啟動速度
adb shell am start -W 包名/Activity

11.對比看APK大小是否有增大

12.跑1小時Monkey宣蠕,測試其穩(wěn)定性


感謝評論區(qū)的 “美猴王丶”、“夢開始陣痛”甥捺、“ziabo_yu” 提出的問題和新的檢查點抢蚀。已添加到文章中~

碼字不易,轉載請注明出處:http://www.reibang.com/p/4b65967fe4a0

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末镰禾,一起剝皮案震驚了整個濱河市皿曲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吴侦,老刑警劉巖屋休,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異备韧,居然都是意外死亡劫樟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門织堂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叠艳,“玉大人,你說我怎么就攤上這事捧挺÷敲啵” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵闽烙,是天一觀的道長翅睛。 經(jīng)常有香客問我,道長黑竞,這世上最難降的妖魔是什么捕发? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮很魂,結果婚禮上扎酷,老公的妹妹穿的比我還像新娘。我一直安慰自己遏匆,他們只是感情好法挨,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布谁榜。 她就那樣靜靜地躺著,像睡著了一般凡纳。 火紅的嫁衣襯著肌膚如雪窃植。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天荐糜,我揣著相機與錄音巷怜,去河邊找鬼。 笑死暴氏,一個胖子當著我的面吹牛延塑,可吹牛的內容都是我干的。 我是一名探鬼主播答渔,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼关带,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沼撕?” 一聲冷哼從身側響起豫缨,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎端朵,沒想到半個月后好芭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡冲呢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年舍败,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敬拓。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡邻薯,死狀恐怖,靈堂內的尸體忽然破棺而出乘凸,到底是詐尸還是另有隱情厕诡,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布营勤,位于F島的核電站灵嫌,受9級特大地震影響,放射性物質發(fā)生泄漏葛作。R本人自食惡果不足惜寿羞,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赂蠢。 院中可真熱鬧绪穆,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至难菌,卻和暖如春途乃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扔傅。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烫饼,地道東北人猎塞。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像杠纵,于是被迫代替她去往敵國和親荠耽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容