Intereting Posts
Динамический vs формат XML в Android? Просмотр символов хинди на разных устройствах Настройка «аффинности задачи» программно Как настроить фокус на просмотр при создании и отображении макета? Как найти позицию элемента в AutoCompletetextview, заполненном массивом Сохранение данных на внешнем хранилище GridLayout рушится на небольшом дисплее Ошибка конфликта зависимостей в моем приложении для Android, которое имеет Android-тесты Android – Подождите, пока ответ залпа вернется Как использовать isInEditMode (), чтобы увидеть макет с пользовательским представлением в редакторе Почему функция setVisibility не работает после просмотра анимированного представления? Как прочитать файл в битовой карте Java? Передача объекта из объекта в фрагмент Как импортировать проект в репозиторий bitbucket из Android Studio? Где должны быть записаны вызовы службы android для GoogleAPIClient при использовании шаблона MVP в android?

Когда закрыть курсор, используемый в SimpleCursorAdapter

Я использую SimpleCursorAdapter для отображения результатов в ListView, но так как я много раз запрашивал свою базу данных во время поиска (используя виджет SearchView), меня беспокоит, что курсор может быть оставлен открытым.

Вот как я запрашиваю свою базу данных и показываю результаты в ListView:

class SearchCustomers extends AsyncTask<String,Void,Cursor>{ @Override protected Cursor doInBackground(String... params) { //get the query String query=params[0].toLowerCase(Locale.getDefault()); Cursor cursor=mDB.searchCustomersByName((query != null ? query : "@@@@")); return cursor; } @Override protected void onPostExecute(Cursor result) { if (result != null) { String[] from = new String[] { QuickOrderDB.ID, QuickOrderDB.NAME, QuickOrderDB.ADDRESS, QuickOrderDB.PHONE_NUMBER }; int[] to = new int[] { R.id.customerIDTextView, R.id.customerNameTextView,R.id.customerAddressTextView , R.id.customerPhoneTextView }; SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(SearchCustomersActivity.this, R.layout.results_customer_item, result, from, to); mResultsListView.setAdapter(cursorAdapter); } } } 

Я пробовал много вещей, чтобы закрыть курсор, но даже если я mResultsListView.setAdapter(cursorAdapter); его после mResultsListView.setAdapter(cursorAdapter); Результат всегда один и тот же: пустой ListView .

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

Есть ли официальная документация об этом? Действительно ли SimpleCursorAdapter автоматически закрывает курсор? ?

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

Solutions Collecting From Web of "Когда закрыть курсор, используемый в SimpleCursorAdapter"

  1. Вам нужно закрыть курсор, как только вы закончите с ним. Закрытие его после вызова setAdapter () будет препятствовать доступу адаптера к данным. Следовательно, лучшим местом для закрытия курсора было бы во время текущих действий срывать этапы жизненного цикла, такие как onPause () или onStop (). (OnDestroy () не должен использоваться, поскольку время выполнения Android не гарантирует его вызова. Я думаю, что последняя версия onStop () гарантирована)
  2. Я не думаю, что адаптер SimpleCursorAdapter автоматически автоматически закрывает курсор. В официальном документе упоминается, что changeCursor () автоматически закрывает старый курсор, поэтому другой вариант может заключаться в изменении курсора после поиска. http://developer.android.com/reference/android/widget/CursorAdapter.html#changeCursor(android.database.Cursor)

Лучше, если вы используете курсор с помощью CursorLoader вместо AsyncTask. Погрузчики синхронизируются с жизненным циклом Activity / Fragment через LoaderManager, и система автоматически закрывает курсор, предоставляемый CursorLoader, когда это необходимо.

Вы должны закрыть курсор в своем onPause() фрагмента или операции onPause() . После того, как действие приостановлено, возможно, что старые Android-системы удаляют приложение для бесплатной памяти.

Это означает, что вам нужно восстановить курсор в соответствующем onResume() .

Не создавайте переменную для курсора, просто добавьте запрос db непосредственно в конструктор в качестве аргумента c , db.query() или метода, который содержит требуемый запрос), похоже, это работает.

 SimpleCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to, int flags)