Подтвердить что ты не робот

Что такое метод recycle() в TypedArray

Я создал GalleryView и ImageView который отображает изображение больше при нажатии элемента в галерее. Я использовал приведенный ниже код для реализации ImageAdapter:

public ImageAdapter(Context c)
{
    context = c;
    TypedArray a = obtainStyledAttributes(R.styleable.gallery1);
    itemBackground = a.getResourceId(R.styleable.gallery1_android_galleryItemBackground, 0);    
    a.recycle();    
}

Когда я удалил оператор a.recycle() изменений не было, и приложение работает нормально, как и раньше, но везде я читал, что обязательным является повторное использование typedArray. Когда нет никаких изменений в том, как работает мое приложение, что такое метод recycle()?

4b9b3361

Ответ 1

Суть аналогична идее очистки указателя на языке Си (если вы знакомы с этим). Он используется, чтобы сделать данные, связанные с готовы для сбора мусора, так память/данные не нерационально обязан, когда он не должен быть. a a Узнайте больше здесь.

Важно отметить, что в этом нет необходимости, если только вы на самом деле не используете "a". GC должен автоматически очистить эти данные для вас, если объект не используется снова. Однако причина, по которой TypedArray отличается, заключается в том, что TypedArray содержит другие внутренние данные, которые должны быть возвращены (известные как StyledAttributes) в TypedArray для последующего повторного использования. Читайте об этом здесь.

Ответ 2

recycle() приводит к тому, что выделенная память будет немедленно возвращена в доступный пул и не останется до сбора мусора. Этот метод также доступен для Bitmap.

Ответ 3

recycle в основном означает. free/clearing все данные, связанные с соответствующим ресурсом. В Android мы можем найти утилиту для Bitmap и TypedArray.

Если вы проверяете оба исходных файла, вы можете найти логическую переменную "mRecycled", которая является "false" (значение по умолчанию). Он присваивается "true", когда вызывается recycle.

Итак, теперь, если вы проверяете этот метод (метод перебора в обоих классах), вы можете заметить, что они очищают все значения.

Для справки приведены методы.

Bitmap.java:

    public void recycle() {
    if (!mRecycled && mNativePtr != 0) {
        if (nativeRecycle(mNativePtr)) {
            // return value indicates whether native pixel object was actually recycled.
            // false indicates that it is still in use at the native level and these
            // objects should not be collected now. They will be collected later when the
            // Bitmap itself is collected.
            mBuffer = null;
            mNinePatchChunk = null;
        }
        mRecycled = true;
    }
}

TypedArray.java

    public void recycle() {
    if (mRecycled) {
        throw new RuntimeException(toString() + " recycled twice!");
    }

    mRecycled = true;

    // These may have been set by the client.
    mXml = null;
    mTheme = null;
    mAssets = null;

    mResources.mTypedArrayPool.release(this);
}

эта строка

mResources.mTypedArrayPool.release(this);

выдает typedArray из SunchronisedPool, значение по умолчанию которого равно 5. Поэтому вы не должны использовать тот же typedArray, когда он очищается.

один раз "mRecycled" из TypedArray имеет значение true, а при получении его свойств он будет вызывать RuntimeException, говорящий "Невозможно совершать вызовы на повторный экземпляр!".

simlyar также влияет на Bitmap. Надеюсь, что это поможет.

Ответ 4

Поскольку его использование закончено [ after initializing our local attributes ], поэтому мы возвращаем его обратно в пул ресурсов.

просто