久久综合给合久久狠狠狠974色|亚洲成熟丰满熟妇高潮xxxxx|国产又黄又黄又大又粗又爽的视频|日韩久久久精品无码一区二区三区|中文字幕无码乱人伦一区二区三区|国产成人无码区免费内射一片色欲|亚洲av无码久久精品一区二区三区

這些Android開(kāi)發(fā)中必備的代碼Review清單,你get到了嗎?

2020-07-23 07:19:16  閱讀:-  來(lái)源:
這些Android開(kāi)發(fā)中必備的代碼Review清單,你get到了嗎?

前言

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

此外,可能還有些檢查點(diǎn)我并沒(méi)有發(fā)現(xiàn),歡迎大家踴躍在評(píng)論區(qū)補(bǔ)充哈~


清理操作

1.頁(yè)面退出時(shí),是否完成必要的清理操作

  1. 是否調(diào)用Handler的removeCallbacksAndMessages(null)來(lái)清空Handler里的消息;
  2. 是否取消了還沒(méi)完成的請(qǐng)求;
  3. 在頁(yè)面里注冊(cè)的監(jiān)聽(tīng),是否反注冊(cè);
  4. 假如自己用到觀察者模式,是否反注冊(cè);
  5. 假如用了RxJava的話,是否解除訂閱;

2.數(shù)據(jù)庫(kù)的游標(biāo)是否已經(jīng)關(guān)閉

這個(gè)點(diǎn)一般人都知道,出問(wèn)題一般在于,沒(méi)有考慮到多線程并發(fā)時(shí)的情況下,Cursor沒(méi)有被釋放。

所以數(shù)據(jù)庫(kù)的操作需要加上同步代碼塊

詳細(xì)可參考:http://www.2cto.com/kf/201408/329574.html

3.打開(kāi)過(guò)的文件流是否關(guān)閉

4.Android 3.0以下的版本,使用完的Bitmap是否調(diào)用recycle(),否則會(huì)一直占用內(nèi)存

而Android 3.0及以上的版本不需要調(diào)用recycle(),因?yàn)檫@些版本的Bitmap全部放到虛擬機(jī)的堆內(nèi)存中,讓GC自動(dòng)回收。

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


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

1.保存在內(nèi)存中的圖片,是否做過(guò)壓縮處理再保存在內(nèi)存里

否則可能由于圖片質(zhì)量太高,導(dǎo)致OOM

2.Intent傳遞的數(shù)據(jù)太大,會(huì)導(dǎo)致頁(yè)面跳轉(zhuǎn)過(guò)慢。太大的數(shù)據(jù)可以通過(guò)持久化的形式傳遞,例如讀寫(xiě)文件

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

4.放在主頁(yè)面的控件,是否可以考慮用ViewStub來(lái)優(yōu)化啟動(dòng)速度


要小心第三方包

1.build.gradle遠(yuǎn)程依賴第三方包時(shí),版本號(hào)建議寫(xiě)死,不要使用+號(hào)

避免由于新版本的第三方包引入了新的問(wèn)題

2.導(dǎo)入第三方工程時(shí),記得把編碼轉(zhuǎn)換成自己工程當(dāng)前是用的編碼

3.調(diào)用第三方的包或者JDK的方法時(shí),要跳進(jìn)他們的源碼,看要不要加 try-catch

否則可能會(huì)導(dǎo)致自己應(yīng)用的崩潰

4.使用第三方包時(shí),是否加上其混淆規(guī)則

若漏掉加上第三方包的混淆規(guī)則,會(huì)導(dǎo)致第三方包不該混淆的代碼被混淆。在Debug版本沒(méi)有發(fā)現(xiàn)問(wèn)題,但是Release版本就會(huì)出現(xiàn)問(wèn)題

5.系統(tǒng)應(yīng)用添加so時(shí),是否在固件對(duì)應(yīng)的Android.mk文件上加入新增的so,否則系統(tǒng)可能編譯不過(guò)

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

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

1.系統(tǒng)的、自己寫(xiě)的,注冊(cè)和反注冊(cè)的方法,是否成對(duì)出現(xiàn)

2.在生命周期的回調(diào)里,創(chuàng)建和銷毀的代碼是否對(duì)應(yīng)起來(lái)

比如:onCreate()里面創(chuàng)建了Adapter,那么對(duì)應(yīng)Adapter的退出處理操作(比如清空Image緩存),一般就要寫(xiě)在onDestory(),而不能寫(xiě)在onDestoryView()。

類似的生命周期對(duì)應(yīng)的代碼有:

onStart()、onStop();

onCreate()、onDestory();

onResume()、onPause();

onCreateView()、onDestoryView()

3.若ListView的item復(fù)用了,對(duì)Item里View的操作是否成對(duì)出現(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;
}

比如以上對(duì)mTitleView、mGreenLabelView和mRedLabelView的操作,都是成對(duì)出現(xiàn)。否則ListView可能會(huì)由于Item復(fù)用,導(dǎo)致Item顯示錯(cuò)亂問(wèn)題


防內(nèi)存泄漏

1.內(nèi)部類,比如Handler、Listener、Callback是否是成static class

因?yàn)榉庆o態(tài)內(nèi)部類會(huì)持有外部類的引用。

2.假如子線程持有了Activity,要用弱引用來(lái)持有

比如Request的Activity就應(yīng)該用弱引用的形式,防止內(nèi)存泄漏。

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


Handler相關(guān)

1.使用View.post()是否會(huì)有問(wèn)題

因?yàn)樵赩iew處于detached狀態(tài)期間,post()里面的Runnable是不會(huì)被執(zhí)行的。只有在此View處于attached狀態(tài)時(shí)才會(huì)被執(zhí)行。

如果想改Runnable每次肯定會(huì)被執(zhí)行,那么應(yīng)該是用Handler.post來(lái)替代

2.假如程序可能多次在同一個(gè)Handler里post同一個(gè)Runnable,每次post之前都應(yīng)該先清空這個(gè)Handler中還沒(méi)執(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.多思考某些情況下,某變量是否會(huì)為空

而且在函數(shù)體內(nèi),處理參數(shù)前,必須加上判空語(yǔ)句

2.回調(diào)函數(shù)是否處理好

回調(diào)函數(shù)很容易出問(wèn)題。比如網(wǎng)絡(luò)請(qǐng)求的回調(diào),需要判斷此時(shí)的Aciivity等是否還存在,再進(jìn)行調(diào)用。因?yàn)楫惒讲僮骰貋?lái),Activity可能就消失不存在了。

而且還要對(duì)一些可能被回收的變量進(jìn)行判空。

3.修改數(shù)據(jù)庫(kù)后,是否把數(shù)據(jù)庫(kù)的版本號(hào)+1

4.啟動(dòng)第三方的Activity時(shí),是否判斷了該Intent能否被解析

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

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

5.新注冊(cè)的Activity、Service或Provider,若AndroidManifest.xml中exported屬性為true,要考慮是否會(huì)引發(fā)安全性問(wèn)題

 android:exported="true"/>

因?yàn)閑xported屬性為true時(shí),外部應(yīng)用就可以直接調(diào)用起該Activity。

可能導(dǎo)致的問(wèn)題:

1)若外部應(yīng)用直接啟動(dòng)詳情頁(yè),從而讓某些驗(yàn)證頁(yè)面直接被繞過(guò)

2)若外部應(yīng)用給該Activity傳遞亂七八糟的Intent,可能讓該應(yīng)用崩潰。也就是Android中的拒絕服務(wù)漏洞

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

6.不要在Activity的onCreate里調(diào)用PopupWindow的showAsLoaction方法,由于Activity還沒(méi)被加載完,會(huì)報(bào)錯(cuò)


功能完成后,自測(cè)時(shí)的檢查點(diǎn)

1.思考某些情況下,某個(gè)變量是否會(huì)造成空指針問(wèn)題

2.把手機(jī)橫屏,檢查布局是否有Bug

3.在不同分辨率的機(jī)型上,檢查布局是否有Bug

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

5.從低版本升級(jí)上來(lái),會(huì)不會(huì)有問(wèn)題

比如可能會(huì)出現(xiàn)數(shù)據(jù)庫(kù)不兼容的問(wèn)題

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

7.熄滅屏幕再打開(kāi)是否正常

8.切換成其它應(yīng)用再切換回來(lái)會(huì)怎樣

9.利用手機(jī)的開(kāi)發(fā)者選項(xiàng)中的 “調(diào)試GPU過(guò)度繪制” ,“GPU呈現(xiàn)模式分析” 和 “顯示FPS和功耗” 功能,看自己的新功能是否會(huì)導(dǎo)致過(guò)度繪制、是否會(huì)掉幀

10.測(cè)試看是否影響啟動(dòng)速度

adb shell am start -W 包名/Activity

11.對(duì)比看APK大小是否有增大

12.跑1小時(shí)Monkey,測(cè)試其穩(wěn)定性

Android進(jìn)階資料

這些Android開(kāi)發(fā)中必備的代碼Review清單,你get到了嗎?

以上資料私信回復(fù)“Android”即可獲取