Intereting Posts
Повторная попытка подключения http Не удалось включить AndroidHttpTransport в мой проект Не удалось отправить текстовые данные между двумя устройствами Bluetooth в android? Android One Plus Two: не удалось изменить локаль для db Ошибка: не удалось выполнить: com.google.android.gms: play-services-measurement: 9.2.0 Настройка нескольких адаптеров для одного вида списка Фрагмент Android, нет представления для идентификатора внутри TabHost Если нужно создать связь с устройством Bluetooth LE Как отключить нажатие кнопки? Создайте файл PKCS # 12 с самозаверяющим сертификатом через OpenSSL в Windows для моего приложения для Android Как проверить, действительно ли мобильные данные активны или Wi-Fi действительно связан с любой горячей точкой? Экран предпочтения Пользовательский макет работает только со вторым щелчком Как получить динамический динамический идентификатор дочернего вида с щелчком мыши на LinearLayout? Как заставить камеру Android отображать в портретном режиме, или вместо меня сделать поворот Расширение AsyncTask <Void, Void, Void>

Рекомендации по обращению с поиском

У меня есть настройка SearchView , и у меня есть свободно развязанная архитектура с использованием Retrofit и Otto .

Мне интересно, что такое Best Practices для поиска в Android или любое мобильное приложение в целом (что-то вроде этого может быть применено и к iOS).

В частности, я использую AutoCompleteTextView для обработки предложений в моем SearchView и данные поступают прямо из API . Я не считаю, что это лучшая практика, поскольку каждый раз, когда пользователь меняет текст в SearchView инициируется вызов API.

Я думаю о хранении кеша в SQLite, а затем отсканировании результатов оттуда, но что, если пользователь хочет получить самые непосредственные данные? Как бы вы справились с этим? Какой шаблон будет использовать?

По достоинству оценят любые мысли о лучшей архитектуре или подход к поиску в Android.

Я думаю, что нет смысла делать вызов API до того, как пользователь перестанет печатать. Итак, вы можете положить задержку, скажем, 500 мс. Когда пользователь перестает печатать, после 500 мс вы вызываете вызов API и показываете результаты.

Вы можете использовать метод postDelayed Handler для планирования запросов API поиска. Вы можете использовать Handler для управления очередью сообщений. Вы отправляете задержанный Runnable каждый раз, когда пользователь вводит символ и отменяет предыдущие сообщения. Это будет выглядеть так:

 public void onTextChanged(CharSequence s, int start, int before, int count) { handler.removeCallbacks(searchRunnable); handler.postDelayed(searchRunnable, 500); } 
  • Сначала вам нужно сделать столбец индексом, который является атрибутом поиска.
  • Вам нужно сохранить только этот столбец в базе данных sqlite. Он используется для выбора параметров из вашей таблицы, когда поиск выполняется пользователями.
  • То вы вызываете api для результата поиска, после слова, выбранного в строке поиска.

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

Сначала нам нужно задать несколько вопросов относительно того, как мы будем решать этот вопрос:

  • Есть автозаполнение?
  • Какова область поиска?
  • Будет ли кеширование?

И еще много вопросов.

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

Кэширование может быть выполнено с помощью помощников SQLite в Android. Это может быть дорого, но мы имеем дело с простыми объектами запроса (как это должно быть в случае с API, объекты должны быть размером памяти или байта).