Задать вопрос

Скачивание файла и парсинг в андроид?

Добрый день,

в приложении необходимо разбирать небольшой xml файлик.
Делаю так - качаю на телефон файл (AsyncTask), затем пытаюсь его разобрать тут же в общем потоке.
Практически всегда возникает ситуация - похоже файл еще не скачан, и парсер разбирает пустой файл.
Т.е. получается разбирать необходимо тоже в асинктаске, или в общем потоке ждать когда отработает асинктаск и только потом запускать парсер?

Еще вопрос по кеш - это просто копирование файлов или есть спец средства андроид.

Спасибо.
  • Вопрос задан
  • 3292 просмотра
Подписаться 4 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 4
@mousexaker
Есть несколько подходов для решение данной задачи:
1. Скачать XML в файл и потом парсить этот файл.
2. Скачать XML в память и парсить его из памяти (плохой вариант. так как размер XML может быть большим).
Оба варианта стоит выполнять в AsyncTask-е. Процесс парсинга можно выполнять в этом же AsyncTask-е или же в другом, это зависит от поставленной задачи. Выполнять парсинг в основном потоке я не рекомендую, так как данная операция достаточно трудоемкая, особенно если большой размер XML-а.
Ответ написан
Комментировать
senneco
@senneco
Сложилось ощущение, что вы делаете запуск парсинга не после завершения асинхронного запроса, а после старта выполнения таски, прям в главном потоке.

Если это так, то нужно стартовать парсинг в методе onPostExecute вашей AsyncTask'и. А парсить ли XML асинхронно, или же прям на главном потоке - вопрос другой, но лучше, конечно, делать в AsyncTask.

А по поводу кэша - уточните ваш вопрос, что именно вы имеете ввиду? Если вообще про способы кэширования, то ответ будет такой: как таковых суперуниверсальных спец. средств кэширования нет. Можно использовать ContentProvide, DB, Shared preference и просто файл хранить в системе - уже зависит от конкретной задачи.
Ответ написан
@mousexaker
Если я не ошибаюсь то метод onPostExecute выполняется в основном потоке а не в бекграунде.
Ответ написан
Комментировать
Benderlidze
@Benderlidze Автор вопроса
вставил метод асинктаска get() сразу после вызова таска, и все волшебным образом заработало как надо
хотя на данный момент не понимаю почему.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы