Можно ли остановить разбор Gson? - PullRequest
0 голосов
/ 22 сентября 2011

Я только что заметил, что производительность Gson - не то, что я ожидал, и некоторые процессы анализа занимают много времени.Я не ищу другого решения, мое приложение довольно большое, и я не хочу изменять его структуру с помощью чего-то еще, например, Джексона.

Мое приложение для Android позволяет пользователю останавливать http-запрос с обратной стороны.ключ.Мой код прерывает запрос и в основном останавливает задачу.Дело в том, что нужно дождаться, пока метод gson.fromJson(result) прервет задачу.Эта инструкция может длиться пару секунд.

Можно ли как-то сказать объекту gson прервать процесс анализа?

Ответы [ 4 ]

2 голосов
/ 22 сентября 2011

Я не знаком с GSON, но вы можете закрыть основной поток данных JSON (Inpustream), чтобы завершить процесс синтаксического анализа с исключением, которое вы можете перехватить.Это должно работать, если входные данные могут быть потоком.Я только что взглянул на API GSON, а метод fromJson принимает параметр Reader, который можно закрыть.Плохой способ может быть также запустить его в потоке и вызвать thread.stop ().

0 голосов
/ 28 сентября 2011

Вы, вероятно, можете сделать это, буферизуя ответ, и выполняя синтаксический анализ, только когда все завершено; или прекращение обработки отменено.

0 голосов
/ 22 сентября 2011

AFAIK `Gson.fromJson ()’ - это вызов метода блокировки, который в Java не может быть остановлен.

Запуск разбора в фоновом потоке. В этом случае вы можете просто оставить его запущенным, поскольку это не влияет на часть пользовательского интерфейса вашего приложения.

Используйте AsynTask для этого. Добавьте поле cancelled, чтобы уведомить задачу об отмене, чтобы оно не обновляло пользовательский интерфейс в конце.

0 голосов
/ 22 сентября 2011

Возможно, вы могли бы попытаться разделить один вызов gson на несколько вложенных вызовов (поскольку анализируемые данные кажутся огромными, когда запрос выполняется за секунды).

По сути, я имею в виду анализировать каждый элемент массива по отдельности или анализировать атрибуты класса один за другим, выполняя всю работу за один вызов. Таким образом, вы могли бы прервать этот процесс более легко.

...