Intereting Posts
Не удается прочитать свойство «getPicture» неопределенной ионной камеры Скопировать файл в папку с ресурсами Удалите прописку вокруг значка действия слева на Android 4.0+ Поддержка телефона и планшета для расстояния между кнопками в макете Могу ли я сразу же сделать ошибки Android Studio, например, Eclipse? Обновлены инструменты SDK и ADT до 17 и теперь получают VerifyErrors Использует Scala на Android? Много накладных расходов? Проблемы? Не удалось написать алгоритм фильтрации элементов в RecyclerView на основе долгого сохранения с каждым элементом Какие датчики используются для Sensor.TYPE_ROTATION_VECTOR Синхронизированная анимация SyncAdapter – как узнать, активно ли SyncAdapter синхронизация Невозможно вывести данные на износ аэродрома (эмулятор) Анимировать высоту PhotoView для Android Почему я не могу создать несколько идентификаторов клиента OAuth 2.0 для одного и того же имени пакета? Как я могу использовать значок системы в Android (например, expander_ic_maximized) SetContentView () медленный с фрагментом карты

Когда закрыть курсор, используемый в 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)