Intereting Posts
Android: сканирование каталога и отображение изображений (эскизов) (изображения не хранятся в медиасторе) Версия студии Android для Mac OSX 10.7.5 Ссылки / значки, которые генерируются в кодебе, не отображаются на некоторых мобильных устройствах Как назначить «Хэширование ключа разработки» для устройства, а не эмулятора Идентификатор ресурса не найден для атрибута 'layout_behavior' в пакете Android: исключение из памяти / Как decodeResource добавляет в бюджет VM? Как реализовать ItemAnimator RecyclerView, чтобы отключить анимацию notifyItemChanged Android: ProgressDialog не показывает Как неявные объединенные столбцы работают с данными контактов Android? Выйти из другой активности в Google plus интеграции не работает Int array to opengl texture в android Java.lang.NoClassDefFoundError: android.os.AsyncTask Загрузка Android OBB / ZIP (cocos2dx) Android Slide для расширения просмотра Как проверить Fingerprint самоподписанного SSL-сертификата на Android?

Что я должен использовать для предварительной загрузки данных с помощью Volley на Android?

У меня есть некоторые данные, хранящиеся в базе данных. В этом случае пользователи приложения.

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

Я знаю, что AsyncTask и Volley выполняют асинхронные запросы к моему API, но в большинстве случаев не все пользователи будут отображаться на макете, потому что они еще не были извлечены в момент отображения макета.

Я также искал, и кажется, что есть некоторые способы (которые иногда кажутся обходными способами), чтобы сделать как AsyncTask и Volley синхронными, но они блокируют UIThread.

Я знаю разницу в asynchronous и synchronous запросах и почему вторая блокирует приложение, поэтому у меня есть некоторые вопросы.

  • Всегда ли рекомендуется использовать асинхронные запросы?
  • Если синхронные запросы плохие, что используется в тех случаях, когда вам нужно, чтобы данные, которые вы извлекали из вашей базы данных, будут отображаться одновременно с отображением макета?
  • Если я хочу, чтобы эти данные были доступны для всего класса макета, как я могу его обработать? Мне нужно отображать данные на экране при рендеринге макета, но я также хочу сделать некоторые вещи с ним, поэтому, если я попытаюсь использовать его в любом месте из метода onResponse запроса Volley, я всегда получаю null . Что-то как «предварительная загрузка» данных.

Заранее спасибо!

Наконец, я замечаю, что моя проблема onResponse с концепциями, потому что я думал, что вы не сможете использовать данные, извлеченные из метода onResponse запроса Volley .

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

Затем я создаю глобальную переменную (в верхней части фрагмента):

 String string = ""; 

И я создаю функцию, которая назначит параметр этой глобальной переменной:

 public void setString(String string){ this.string = string; } 

Чтобы закончить, после того, как я получаю строку, я вызываю эту функцию по методу onResponse :

 StringRequest jsonArrayRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { try { //Do stuff to retrieve the String setString(response); //Assign the string "response" to the global variable via the method. } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("LOG", error.toString()); } }); 

Если вам нужно сделать что-то с этими данными, вы должны подождать, пока данные будут полностью восстановлены, чтобы вы могли показывать диалог.

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

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

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

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

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

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

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

Поэтому, чтобы дать вам возможность начать, немного изучите следующие темы.

  1. Кэширование (локальное хранилище, т.е. Realm )
  2. Обращение с пейджингом ( статья с разбивкой на страницы)
  3. Старайтесь избегать использования асинхронных задач, их трудно справиться и больше головной боли, чем они того стоят. Изучите модернизацию
  4. Понимайте, как работает каркас Android, а также различия между синхронными и асинхронными парадигмами.