tarotaroのエンジニア生活

技術ネタとか日々の仕事の話とか

Androidアプリの速度の最適化

今回は、アプリを作ったときに反応速度が気になるときの最適化というか、速度がかわる方法を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に書き込む方法を最適化してみましょう。

    public void inserts(ArrayList<Data> data) {
        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);
をすればいいです。

ぜひともお試しあれ。