Я протестировал свое приложение в MotoG 2nd Gen (1GB RAM, Quad-core 1.2 GHz)
. У меня есть следующий статический метод в классе Misc
. itemRates
массив является Object
массив длины: 132, содержащий ниточки вокруг длиной 50 символов: -Android SQLite Cursor медленный при вызове функции
public static double getDCRate(String item){
for(int i=0;i<itemRates.length;i++){
String ar[] = (itemRates[i]+"").split("[;]");
if(ar[0].equals(item)){
return Double.parseDouble(ar[1]);
}
}
return 0;
}
Теперь в моем AsyncTask
, я называю эту функцию, как показано ниже: -
/* db initialized */
Cursor c = db.rawQuery(sql, null);
if (c.moveToFirst()) {
do {
/* ... */
double totalCost = 0.0;
double ntwt_double = c.getDouble(c.getColumnIndex("Ntwt"));
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN1")))*(c.getDouble(c.getColumnIndex("DP1"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN2")))*(c.getDouble(c.getColumnIndex("DP2"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN3")))*(c.getDouble(c.getColumnIndex("DP3"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN4")))*(c.getDouble(c.getColumnIndex("DP4"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN5")))*(c.getDouble(c.getColumnIndex("DP5"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN6")))*(c.getDouble(c.getColumnIndex("DP6"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN7")))*(c.getDouble(c.getColumnIndex("DP7"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN8")))*(c.getDouble(c.getColumnIndex("DP8"))/100)*ntwt_double;
Для завершения AsyncTask
требуется около 12 секунд. Эх ?! Достаточно велика для создания небольшого массива. Чтобы проверить, что это вызов функции, я удалил вызовы функций, чтобы найти завершение AsyncTask
примерно за 1 секунду! Следует отметить, что я использую те же строки кода в своем приложении swing, которое также является основой Java. Итак, почему требуется так много времени для работы в Android? Любая идея, как решить эту дилемму?
Вы пробовали профилирование? Это даст вам лучшее представление о том, где тратится время. – matiash
@matiash, спасибо за ваш совет. Посмотрите на мой ответ. Можете ли вы придумать какую-либо причину, по которой «split» потребляет столько времени и памяти в Android, но в качели, это просто отлично? – khandelwaldeval