Погрузчики и onLoaderReset Android

Я применил загрузчик в своем приложении для запроса данных из базы данных. Я слушаю изменения, которые происходят «путем реализации LoaderCallbacks<Cursor> listener. Проблема, с которой я столкнулась, заключается в использовании onLoaderReset(Loader<Cursor> loader) при изменении моих данных, и я хочу аннулировать и освободить любые данные, связанные с загрузчиком. Во всех примерах в этом методе есть следующий вызов:

mAdapter.swapCursor(null);

Но дело в том, что я не использую данные из курсора в адаптере, я использую его каким-то другим способом в своем приложении.

(Непосредственно из возвращаемого курсора в onLoadFinished(Loader<Cursor> loader, Cursor data) , например)

  @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { if (data.moveToFirst()) { TOTAL_CARDS = data.getCount(); mView.createCards(TOTAL_CARDS); } else { TOTAL_CARDS = 0; mView.createCards(TOTAL_CARDS); } } 

Что было бы здесь, что похоже на mAdapter.swapCursor . У меня нет большого опыта работы с загрузчиками, на самом деле я только начал работать с ними, поэтому, если у кого-то есть решение, я был бы признателен. Спасибо!

EDIT: На данный момент я передаю null загрузчику, и он работает, как это:

 @Override public void onLoaderReset(Loader<Cursor> loader) { loader = null; } }; 

Но это правильное решение?

Solutions Collecting From Web of "Погрузчики и onLoaderReset Android"

дела

 @Override public void onLoaderReset(Loader<Cursor> loader) { loader = null; } 

Так же хорошо, как ничего не делать. В вашем примере кода вы просто обнуляете локальную ссылку вашего метода на свой аргумент. Однако эта ссылка всегда будет удалена после возврата вызова метода. (Возможно, вы захотите прочитать « Java-pass-by-reference» или «pass-by-value» для дальнейшего обсуждения темы.)

Метод onLoaderReset(Loader) когда обратный вызов вашего загрузчика (обычно экземпляр Activity или Fragment ) предлагается выпустить все ссылки на Cursor которые он получил через onLoadFinished(Loader, Cursor) раньше. В основном этот метод просит вас очистить, так как Loader скоро закроет Cursor он вам предоставил раньше. После того, как курсор был закрыт, вы больше не сможете извлекать данные. Если курсор, тем не менее, будет использоваться (обычно с помощью CursorAdapter как вы упомянули) после его закрытия, это приведет к тому, что будет CursorAdapter исключение.

Аналогично, onLoadFinished(Loader, Cursor) имеет неявный контракт, onLoadFinished(Loader, Cursor) чтобы после того, как метод вернул ранее предоставленные объекты Cursor больше не будет использоваться. Вместо этого вам нужно заменить эти ссылки новым курсором, который предоставляется как аргумент метода. Напротив, onLoaderReset(Loader) просит вас выполнить тот же контракт, но без предоставления замены, то есть вы должны удалить все ссылки на ранее извлеченный Cursor .

В вашем примере вы не позволяете своему Cursor избежать области метода, но вместо этого вы сразу читаете данные. Поэтому нет необходимости удалять ссылки на объект Cursor который был предоставлен через onLoadFinished(Loader, Cursor) поскольку их нет. Таким образом, пустая реализация onLoaderReset(Loader) для выполнения контракта с интерфейсом сделает эту работу за вас.