Можно ли закрыть объект Cursor () и чем установить для него новое значение? - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь понять реализацию RecyclerView.Adapter, которую мне нужно использовать, где набор данных является объектом Cursor.
Но некоторая логика мне не ясна в отношении закрытия объекта Cursor и его установки в другое значение.
Что именно происходит в close ()? Это нормально. ?

   public void setCursor(Cursor cursor){
        mCursor.unregisterContentObserver(mMyContentObserverr);
        mCursor.close();

        mCursor = cursor;
        mCursor.registerContentObserver(mMyContentObserverr);
        notifyDataSetChanged();
    }

Или я должен быть в безопасности, как это:

   public void setCursor(Cursor cursor){
        Cursor oldCursor = mCursor;
        oldCursor.unregisterContentObserver(mMyContentObserverr);
        oldCursor.close();

        mCursor = cursor;
        mCursor.registerContentObserver(mMyContentObserverr);
        notifyDataSetChanged();
    }

Каковы преимущества использования oldCursor?
Есть ли опасность при закрытии и установке на одном и том же объекте Cursor?
спасибо

1 Ответ

0 голосов
/ 06 сентября 2018

Две части кода, которые вы включили, функционально эквивалентны. Линия

Cursor oldCursor = mCursor;

создает новую ссылку Cursor, которая указывает на один и тот же объект, то есть mCursor и oldCursor имеют одинаковое расположение в памяти. Поскольку это один и тот же объект, oldCursor.close() точно такой же, как mCursor.close().

Однако, когда вы устанавливаете mCursor в cursor, mCursor больше не ссылается на курсор, который был закрыт; теперь он ссылается на тот же объект, что и cursor. Любые операции, которые вы выполняете с новым mCursor, никак не будут затронуты старым mCursor.

Что касается версии, которую вы должны использовать, я бы лично выбрал первую версию. Однако, если вы чувствуете, что код становится более понятным, создав oldCursor, обязательно сделайте это. Это точно так же.

...