2011-08-31 18 views
30

GalleryViewとImageViewを作成しました。ギャラリー内で項目をクリックすると、Imageが大きく表示されます。私はImageAdapterを実装するために以下のコードを使用していますTypedArrayでのrecycle()メソッドの使用方法

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

私はそこに何の変化やアプリが以前のように正常に動作しているがありませんが、どこでも、私はtypedArrayをリサイクルする義務であることを読ん声明a.recycle()を削除する場合。私のアプリの実行方法に変更がない場合は、recycle()メソッドを使用しています。

詳細は誰でも教えてください。ありがとうございました。

答えて

25

ポイントは、C言語でポインタをクリアするというアイデアに似ています(それに精通している場合)。これは、 "a"に関連するデータをガベージコレクションのために準備するために使用されます。そうする必要がない場合、メモリ/データは非効率的に "a"にバインドされません。続きを読むhereを読んでください。実際に "a"を再使用しない限り、これは本当に必要ではないことに注意することが重要です。オブジェクトが再び使用されない場合、GCは自動的にこのデータをクリアします。しかし、TypedArrayが異なる理由は、TypedArrayに、後で再利用するためにTypedArrayに返さなければならない他の内部データ(StyledAttributes)があるためです。そのことについてhereを読んでください。

+2

サイドノート:GCは「ガベージコレクション」の略です。 – Vinay

+3

私は分かりません。最後のリンクは、recycle()を呼び出すと内部配列を再利用できるように見えます。配列がGCされないようにすることはできませんか?なぜ "a"に関連するデータをGCの準備ができていると言いますか? – gsingh2011

+0

@ gsingh2011それはそれが "後の呼び出し元によって再利用される"ことができます。確かにドキュメントの文言はちょっと厄介ですが、彼らが得ているのは、 'TypedArray'に関連するメモリを後の呼び出し元が再利用できるということです(プログラムの範囲内で理解するようにインスタンス自体ではありません)。そのため、ドキュメントでは「この関数を呼び出した後に、型指定された配列に再び触れてはいけません。 – Vinay

5

recycle()は、割り当てられたメモリをすぐに利用可能なプールに戻し、ガベージコレクションまで保持しません。この方法はBitmapでも利用できます。

0

リサイクルは基本的に対応するリソースに関連するすべてのデータを消去/消去することを意味します。 AndroidではBitmapとTypedArrayのリサイクルが見つかります。

両方のソースファイルをチェックすると、 "false"(デフォルト値)のブール変数 "mRecycled"を見つけることができます。リサイクルが呼び出されると "true"に割り当てられます。

だから、そのメソッド(両方のクラスでメソッドをリサイクルする)をチェックすると、すべての値がクリアされていることがわかります。

ここで参考にしてください。

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); 

は、そのデフォルト値は、あなたがそう5. あるSunchronisedPoolからtypedArrayをリリースする予定それがクリアされるときに同じtypedArrayを再び使用すべきではありません。

TypedArrayの "mRecycled"が一度trueになると、そのプロパティを取得している間に、「リサイクルされたインスタンスを呼び出せません!」というRuntimeExceptionがスローされます。

ビットマップの同様の動作も同様です。 お手伝いをしてください。

関連する問題