在做一個應(yīng)用時,實現(xiàn)一個功能:查詢Android手機上安裝的所有APK熄捍,并與本應(yīng)用中的數(shù)據(jù)庫做對比,如果存在則從數(shù)據(jù)庫中取出這個APK的更多信息。部分代碼如下:
for (String one : installedApps) {
App app = mDataSource.getApp(one);
if (app == null)
continue;
PackageInfo pi = AppUtils.getPackageInfo(one);
if (pi != null) {
app.versionCode = pi.versionCode;
app.versionName = pi.versionName;
result.add(app);
}
}
return result;
installedApps 是已經(jīng)獲取到手機上安裝應(yīng)用的包名列表
mDataSource 是數(shù)據(jù)庫的實例荚孵,通過包名可以查詢返回一個自定義對象App
實現(xiàn)以后,發(fā)現(xiàn)在查詢時纬朝,會很卡收叶。經(jīng)過打點,在查詢數(shù)據(jù)庫時共苛,會有2s多的執(zhí)行時間判没。這肯定是不能接受的。經(jīng)過后來優(yōu)化隅茎,改成如下代碼:
List<String> installedApps = AppUtils.getInstalledApps();
return mDataSource.getApps(installedApps);
性能一下就好了很多澄峰,發(fā)現(xiàn)在調(diào)用時不再有明顯卡頓。以前的方法有個缺點就是手機有N個應(yīng)用時辟犀,會查詢N次數(shù)據(jù)庫俏竞,而第二次方法,只會查詢一次數(shù)據(jù)庫堂竟,性能也提高了不少魂毁。
剛開始在解決卡頓問題,并沒有認為問題會出在查詢數(shù)據(jù)庫這里出嘹,通過對代碼塊打執(zhí)行時的時間戳才發(fā)現(xiàn)問題所在席楚。
記錄下來,時刻提醒自己