В этом приложении, над которым я работал, есть базы данных с несколькими мегабайтами данных, которые нужно просеять. Многие действия - это просто ListViews, спускающиеся по разным уровням данных в базах данных, пока мы не достигнем «документов», то есть просто HTML, который нужно извлечь из БД и показать на телефоне. Проблема, с которой я сталкиваюсь, заключается в том, что некоторые из этих действий должны иметь возможность поиска в базах данных путем захвата нажатий клавиш и повторного выполнения запроса с «like% blah%» в нем. Это работает достаточно быстро, за исключением случаев, когда пользователь впервые загружает данные и когда пользователь впервые нажимает клавишу. Я использую ResourceCursorAdapter и создаю курсор в фоновом потоке, но для того, чтобы сделать listAdapter.changeCursor (), мне нужно использовать обработчик, чтобы опубликовать его в основном потоке пользовательского интерфейса. Этот конкретный вызов затем останавливает поток пользовательского интерфейса достаточно долго , чтобы вызвать страшный диалог ANR. Мне интересно, как я могу полностью разгрузить это в фоновом потоке, чтобы пользовательский интерфейс оставался отзывчивым, и у нас не появлялись диалоги ANR.
Просто для полного раскрытия я изначально возвращал ArrayList объектов пользовательской модели и использовал ArrayAdapter, но (по понятным причинам) клиент указал, что это плохое управление памятью, и я все равно не был доволен производительностью. Я действительно хотел бы избежать решения, где я генерирую огромные списки объектов, а затем делаю listAdapter.notifyDataSetChanged / Invalidated ()
Вот код вопроса:
private Runnable filterDrugListRunnable = new Runnable() {
public void run() {
if (filterLock.tryLock() == false) return;
cur = ActivityUtils.getIndexItemCursor(DrugListActivity.this);
if (cur == null || forceRefresh == true) {
cur = docDb.getItemCursor(selectedIndex.getIndexId(), filter);
ActivityUtils.setIndexItemCursor(DrugListActivity.this, cur);
forceRefresh = false;
}
updateHandler.post(new Runnable() {
public void run() {
listAdapter.changeCursor(cur);
}
});
filterLock.unlock();
updateHandler.post(hideProgressRunnable);
updateHandler.post(updateListRunnable);
}
};