Что такое использование метода 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() .

Может кто-нибудь, пожалуйста, объясните мне подробно. Спасибо.

Solutions Collecting From Web of "Что такое использование метода recycle () в TypedArray"

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

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

Переработка в основном означает..бесплатный / очистку всех данных, связанных с соответствующим ресурсом. В 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 является истинным, тогда при получении его свойств он будет вызывать RuntimeException, говорящий «Невозможно совершать вызовы в переработанный экземпляр!».

Simliar поведение также битмап. Надеюсь, поможет.