Intereting Posts
Seem не получает ресурс Facebook SDK при использовании Facebook Android SDK в IntelliJ IDEA 12 Закуска AppCompat не ориентирована на планшет Кластеризация маркеров карты при уменьшении и неавтоматизации при масштабировании Предоставленные зависимости могут быть только баночками Android GCM (push-уведомление): устройство не получает уведомления, если приложение остановлено Android: как возобновить приложение / активность от BroadcastReceiver? Можно ли прочитать чит / пропускную способность кеша CPU в Android? Уведомления BigTextStyle не распространяются на FirebaseMessagingService Проверить пользователей с помощью цифр Кодирование и мультиплексирование видео с использованием MediaCodec и MediaMuxer Несколько действий, конкурирующих с одним намерением Как заблокировать кнопки / телефон Android от кода (блокировка экрана)? Рекомендуемый способ внедрения Push Notifications Выбор номера диалогового окна Android Как я могу получить данные с веб-сервера в приложении 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, а также различия между синхронными и асинхронными парадигмами.