Не знаю, нужно ли это людям.На всякий случай, для будущих искателей.У меня была проблема с предложениями моего SearchView, которые не появлялись.Обыскав вокруг, я нашел решение для этого.Я использовал Volley для своего класса провайдера контента (чтобы получить предложения от веб-API), который, казалось, не вписывался в структуру провайдера контента Android.Я также обнаружил, что мой поставщик контента работает в потоке пользовательского интерфейса.Поэтому, если я использовал в нем Волейное будущее синхронно, он замедлял (блокировал) пользовательский интерфейс до возвращения запроса (тайм-аут).Кроме того, я нашел в Интернете информацию о том, что запрос Volley Future должен выполняться в другом потоке, например в асинхронной задаче, чтобы он работал хорошо.Таким образом, это не решило мою проблему, потому что, если бы мне пришлось использовать его (в асинхронной задаче), я бы вместо этого использовал обычный (асинхронный) запрос Волли (который я использовал тогда).Я сделал следующее:
В моем подклассе ContentProvider я определяю интерфейс слушателя:
открытый интерфейс ResultListener {
void onProviderResult(Cursor mCursor);
void onProviderError(String errorMsg);
}
В своей деятельности (которая реализовала LoaderCallbacks) я реализовал также интерфейс выше.
В моем классе приложения-одиночки я определяю статическую переменную, котораяиспользуется в качестве переходных данных вместе с методами получения / установки:
закрытая статическая HashMap transientData = new HashMap ();
открытая статическая Object getTransientData (String objectName) {
return transientData.get(objectName);
}
public static void setTransientData (String objectName, Object object) {
transientData.put(objectName, object);
}
- теперь логика: в действииперед вызовом getSupportLoaderManager (). initLoader (...) я позвонил MyApplication.setTransientData ("requestor", это) :
в моем контентекласс провайдера, в обратном вызове onResponse запроса залпа,Я сделал это:
public void onResponse (ответ JSONArray) {
...
ResultListener requestor = (ResultListener)TheApplication.getTransientData("requestor");
if (requestor!=null) requestor.onProviderResult(mCursor);
}
Чтобы при возврате запроса залпа вызывался метод обратного вызова запрашивающего,передавая ему курсор, заполненный данными из ответа, и в свою очередь запрашивающая сторона (действие) уведомляет адаптер курсора, вызывая: adapter.swapCursor (c);adapter.notifyDataSetChanged ();
Надеюсь, это кому-нибудь поможет.Будь благословен.