Как обрабатывать огромный массив JSON? - PullRequest
0 голосов
/ 18 января 2019

Когда я вызываю api rest из приложения для Android, он отправляет ответ в виде массива JSON, который содержит более 5000 объектов. При чтении и разборе объекта ответа, использующего цикл for, это занимает слишком много времени и перестает отвечать на запросы.

JSONArray list = new JSONArray(EntityUtils.toString(response.getEntity()));

Вот пример JSON:

[["aa@gmail.com",true],["bb@gmail.com",true],["cc@gmail.com",true],["dd@gmail.com",true],["ee@gmail.com",true],["ff@gmail.com",true],["gg@gmail.com",true],["hh@gmail.com",true]]

Пожалуйста, помогите мне.

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Самый простой и наиболее часто используемый подход к этой проблеме - использовать нумерация страниц . Проще говоря - вы запрашиваете сначала 50 или 100 объектов и отображаете их, затем следующий и так далее. Концепция заключается в том, что обычно конечному пользователю не нужны все 5000 объектов одновременно, поэтому приемлемо получать их при необходимости.

Если по каким-то бизнес / логическим причинам вам необходимо обрабатывать все 5000 объектов одновременно, вы можете подумать о другом формате связи - например, protobuf или XML с SAX-парсером .

В обоих вышеупомянутых случаях вам нужно настроить остальные API, которые обслуживают данные вместе с клиентом. Если у вас нет контроля над серверной частью, вы можете попытаться использовать Android Profiler , чтобы точно определить, какие части синтаксического анализа являются самыми медленными, и оптимизировать их на стороне клиента (android).

0 голосов
/ 18 января 2019

Вы можете использовать фоновый поток, который легко осуществить с помощью AsynTask, напишите свой дорогой код внутри doInBackground

private static class BackgroundTask extends AsyncTask<String, Void, String> {

@Override
protected String doInBackground(String... params) {
    JSONArray list = new JSONArray(EntityUtils.toString(response.getEntity()));
}

@Override
protected void onPostExecute(String html) {
}
}

Также попробуйте проанализировать json с чем-то другим, например, gson намного быстрее для определенного типа данных.

Feed feed = getGson().fromJson(json, Feed.class);

В любом случае, не рекомендуется возвращать 5000 объектов одновременно, ваш API должен быть улучшен, чтобы обрабатывать нумерацию страниц и возвращать от 10 до 100 элементов за запрос в зависимости от ваших потребностей.

0 голосов
/ 18 января 2019

Прежде всего вы должны выполнить все эти задачи в фоновом потоке, и при синтаксическом анализе, если возможно, используйте HashMap<Key,Value>, у него есть методы, такие как hashmap.get("key"), которые будут получать значения без использования цикла for, или вы также можете использовать arraylist из которого вы также можете получить значения без использования цикла for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...