今回は、アプリを作ったときに反応速度が気になるときの最適化というか、速度がかわる方法を2つほどかきたいと思います。特にDBまわりとスレッドまわりです。
まず、DBまわり。
ネットワークを通してえた情報などをオフラインでも使えるように、DBに蓄えたりすることがあると思います。大量のデータをDBHelperでsqlを使ってInsertするときに 次のように一回ずつDBをオープンして、クローズしたりしてませんか?
public void insert(Data data) {
SQLiteDatabase db = getWritableDatabase();
String insertSql;
Date date = new Date();
long time=date.getTime();
insertSql = String.format(
"insert into log_table(insert_date,title,guid,category,description,public_date,vender_name,vender_code) "
+"values (?,?,?,?,?,?,?,?);");
Object arg[]={ String.valueOf(time),data.title,data.guid,data.category,data.description,
data.public_date,data.vender_name,data.vender_code};
db.execSQL(insertSql, arg);
db.close();
}
渡すデータをArrayListにして、DBに書き込む方法を最適化してみましょう。
SQLiteDatabase db = getWritableDatabase();
String insertSql;
Date date = new Date();
long time=date.getTime();
db.beginTransaction();
try{
insertSql = String.format(
"insert into log_table(insert_date,title,guid,category,description,public_date,vender_name,
vender_code) "
+"values (?,?,?,?,?,?,?,?);");
SQLiteStatement stmt = db.compileStatement(insertSql);
for(int ncount=0;ncount<newsdata.size();ncount++){
if(results.get(ncount))continue;
String related_link = "";
String related_title="";
Data nwdata = data.get(ncount);
stmt.bindString(1,String.valueOf(time));
stmt.bindString(2,nwdata.title);
stmt.bindString(3,nwdata.guid);
stmt.bindString(4,nwdata.category);
stmt.bindString(5,nwdata.description);
stmt.bindString(6,nwdata.public_date);
stmt.bindString(7,nwdata.vender_name);
stmt.bindString(8,nwdata.vender_code);
stmt.executeInsert();
}
db.setTransactionSuccessful();
}finally {
db.endTransaction();
}
db.close();
}
この方法を使うことで、実際アプリが5倍ほど早くなりました。
DB保存が遅いなと感じてる方はぜひ試してみましょう。
つぎに、スレッドです。
Asyncや、Threadを使うときにいつもPriorityをいじらずに使っているかたが、多いのではないでしょうか。PriorityをMIN_PRIORITYにするだけで、Galaxy系は2倍近く速度があがることが確認できました、
HTCの端末だと1.5倍ぐらいでした。Priorityを低くすると優先度が下がると思われますが、なぜか速度はあがります。いまのところ特にUI Threadが遅くなるとかもないようなので、設定するといいと思います。
Threadの場合は普通にsetPriorityで。
Asyncの場合は、doInBackgroundのなかで、
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
をすればいいです。
ぜひともお試しあれ。