2015-01-06 1 views
0

Я протестировал свое приложение в 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? Любая идея, как решить эту дилемму?

+0

Вы пробовали профилирование? Это даст вам лучшее представление о том, где тратится время. – matiash

+0

@matiash, спасибо за ваш совет. Посмотрите на мой ответ. Можете ли вы придумать какую-либо причину, по которой «split» потребляет столько времени и памяти в Android, но в качели, это просто отлично? – khandelwaldeval

ответ

0

Благодаря @matiash я профилировал метод и обнаружил, что основным виновником был split(..). Не знаю, почему, но методы split, Patter.splitter ..и другие методы составили 52% от общего времени вычислений. Странно, однако, после замены на split, AsyncTask загружается примерно через 2 секунды.

+0

Не видел этого с 'split()' до сих пор, но как только у меня была аналогичная проблема с 'format()'. Счастлив, тебе удалось это решить. – matiash

Смежные вопросы