2015-07-29 1 views
0

У меня есть приложение для перевода на язык, которому необходимо загрузить некоторые исходные данные в первый раз. Когда приложение впервые запускается, первым шагом является получение списка поддерживаемых языков с сервера. Затем пользователь выбирает, какие они хотят установить, а остальные таблицы затем загружаются.Загрузка данных на Android-приложение с первого запуска

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

Если нет сетевого подключения, диалоговое окно должно побуждать пользователя перейти к настройкам WIFI. Если с загрузкой произошла сетевая ошибка, другое диалоговое окно предложит пользователю повторить попытку или подождать до следующего. Если загрузка завершается успешно, запускается новый Intent, чтобы отправить их для выбора языков для установки.

У меня это в основном функционирует (мой AlertDialogs не отображается), но вопрос в том, подходит ли это для этого. В настоящее время я настроил его как AsyncTask, но я видел много сообщений с отзывами о том, как AsyncTask не следует использовать, когда от него зависит пользовательский интерфейс. Достаточно справедливо, но AsyncTask кажется рекомендуемым методом для загрузки данных.

Является ли AsyncTask правильным способом загрузки данных или есть предпочтительная альтернатива?

Как лучше всего справиться с этим в пользовательском интерфейсе, так как это зависит от этих данных? Заставка? Я бы предпочел, но, похоже, что-то должно быть там, и мне нужно где-то отображать AlertDialogs, если это необходимо.

+0

Вы просили спросить на http://ux.stackexchange.com/? (для второго вопроса) – malarres

ответ

0

Является ли AsyncTask правильным способом загрузки данных или есть предпочтительная альтернатива?

Нет, AsyncTask не является хорошим решением для сетей, так как:

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

  2. AsyncTask работает по умолчанию для глобального серийного исполнителя. Он заблокирует все другие задачи async в приложении, пока он не завершится. Поэтому вам нужно будет предоставить своего собственного исполнителя, чтобы этого избежать.

  3. Уровень процесс будет фоновый процесс согласно http://developer.android.com/guide/components/processes-and-threads.html С в Service вы можете достичь обслуживания процесса, который лучше.

Использовать вместо Service. Вы можете реализовать любые потоки, которые вы хотите внутри. Вы можете использовать обычный Thread, ThreadPoolExecutor, Handler или какое-либо третье решение. Service предоставляет вам большую гибкость.

Что касается вашего второго вопроса, то обратите внимание на дизайн материала спецификации первых: https://www.google.com/design/spec/material-design/introduction.html

Придумайте какие-нибудь идеи, а затем задать отдельный вопрос, если это еще не ясно.

+0

Давайте забудем интерфейс. Если 'AsyncTask' не является хорошим решением, почему это используется во многих примерах загрузки данных с сервера? В документации указано: «Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса», который, похоже, подходит для этого использования. Далее, глядя на различные примеры внедрения Сервиса для загрузки, например здесь: [link] http://code.tutsplus.com/tutorials/android-fundamentals-downloading-data-with-services--mobile-5740, они внедрить AsyncTask в службу. Не оспаривая вас, просто смущены заявлениями с обеих сторон. – asorenson

+0

Согласно сообщению: [http://stackoverflow.com/a/6957909/4527140], похоже, что AsyncTask точно соответствует счету. При первом запуске загрузка языков является одноразовой задачей. Кроме того, в этом примере в основных сетевых операциях используется AsyncTask: [http://developer.android.com/training/basics/network-ops/connecting.html] – asorenson

+0

Я думаю, что «Сервис» - более удобное решение для сетей , и да, вы можете использовать 'AsyncTask' в своей' службе', если хотите (но будьте осторожны с № 2). Мне лично не нравится использовать 'AsyncTask' для создания сетей без« Сервиса », потому что сетевое подключение может быть медленным, а« AsyncTask »может занимать около минуты. Если вы не используете «Сервис» в этом случае и просто запустите «AsyncTask» из своей «Деятельности», как бы вы обновили свой интерфейс? Пользователь может изменить ориентацию экрана, и «Активность» будет воссоздана. Вам нужно обработать этот случай, который является болью. –

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