2013-03-25 5 views
0

У меня есть 1000 строк в файле, который будет обслуживаться пользователю каждый раз, когда он загружает приложение.Производительность загрузки содержимого строки Android

Мой текущий подход:

MainActivity: OnCreate: Запустите AsyncTask

AsyncTask onPreExecute: показать прогресс dialiog

AsyncTask doInBackground: Проверьте, если ключ/значение присутствует в sharedpreferences, если да, то ничего не делайте в doInBackground. Если нет (первый пользователь), прочитайте из необработанного файла и создайте строковый конструктор. Храните содержимое StringBuilder в качестве пары ключевых значений в sharedpreferences.

AsyncTask onPostExecute: заполнить текст из общих разделов. Отключите диалог прогресса.

Код для чтения из файла в методе doInBackground является:

StringBuilder sb = new StringBuilder(); 
InputStream textStream = getBaseContext().getResources().openRawResource(R.raw.file); 
BufferedReader bReader = new BufferedReader(new InputStreamReader(textStream)); 

String aJsonLine = null; 
try { 
    while ((aJsonLine = bReader.readLine()) != null) { 
     sb.append(aJsonLine + System.getProperty("line.separator")); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally{ 
    try { 
     bReader.close(); 
     textStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Я вижу, что пользователь должен ждать около 9-10 секунд для первого запуска и 4-5 секунд для последующих запусков. Любые предложения по улучшению производительности в моем случае.

+0

1000 строк быстро, не нужно Задача асинхронного программирования – 2013-03-25 05:52:08

+0

Зависит также от скорости сети. Вы можете использовать сервис, если хотите, чтобы пользователь взаимодействовал с ui. Вы можете использовать robospice. – Raghunandan

+0

@matheszabi, пользовательский интерфейс зависает в течение 10 секунд, если я не использую Async Task. – Sandeep

ответ

1

Вам не нужно, чтобы сделать ваш пользователю ждать весь список, чтобы загрузить. Как только у вас будет достаточно данных для заполнения экрана (возможно, 10-20 элементов), заполните экранный список или что-то еще с данными, которые у вас уже есть, это сделает задержку совершенно несущественной.

Вы можете проверить http://developer.android.com/reference/android/content/AsyncTaskLoader.html, чтобы узнать, как это должно быть сделано.

+0

Ваши предложения выглядят многообещающими, чтобы уменьшить накладные расходы на получение 1000 строк текста, а затем показ 1000 строк в текстовом виде за один раз. Но я сомневаюсь, что как управлять строками, отображаемыми на разных плотностях экрана. Например, если я хочу убедиться, что из 1000, только 10 строк будут отображаться при запуске, как я могу обеспечить его для всех плотностей экрана? Любые идеи полностью разрешат мою проблему. – Sandeep

+0

, когда вы используете 'AsyncTaskLoader', загрузчик сообщит вашей« Деятельности »о наличии новых данных, это может быть 5 элементов, может быть, 10, вы просто возьмете их и обновите свое представление. затем приходит больше предметов. наконец, экран заполнен, и можно прокручивать вверх и вниз. все это, пока остальная часть по-прежнему загружается, и вашему пользователю не нужно следить за индикатором выполнения, (и) он может сразу начать работу с элементами на экране, возможно, выбрать один и перейти к другой «Деятельности», прервав загрузку остальная часть данных. – lenik

0

Я предпочел бы прочитать поток JSON через JsonReader и извлечь интересующие меня пары значений. String concatenation/garbage collection - дорогостоящие операции. Теперь, когда код написан, эти операции замедляют выполнение задачи. Также есть недостатки в коде, такие как доступ к разделителю строк на каждой итерации цикла System.getProperty("line.separator").

Вы должны увидеть значительное повышение производительности только с помощью JSONReader.

1

В небольшой боковой линии к другим комментариям, так как aJsonLine является String, это лучшая идея, чтобы сохранить свое значение вместе с новой строки с помощью двух Append() вместо одного одного:

sb.append(aJsonLine); 
sb.append(System.getProperty("line.separator")); 

вместо:

sb.append(aJsonLine + System.getProperty("line.separator")); 

с позже, как aJsonLine и результат System.getProperty («line.separator»)) должны быть преобразованы в StringBuilder до конкатенации между ними с может иметь место и окончательный значение передается как параметр.

Конечно, вы должны также кэшировать значение System.getProperty("line.separator")) аль

+0

. хотя после публикации этого вопроса я кэшировал значение line.separator, ваш вопрос об использовании отдельного оператора append хорош. – Sandeep