This answerは、TypedArrayのrecycle()
メソッドを呼び出すと、ガベージコレクションが可能になることを示しています。私の質問は、TypedArrayが特にガベージコレクションのためのメソッドを必要とする理由です。通常のオブジェクトのようにガベージコレクションを待つのはなぜですか?TypedArrayをリサイクルする必要があるのはなぜですか?
9
A
答えて
5
これは、商品のキャッシュに必要です。 recycle
に電話すると、この時点からこのオブジェクトを再利用できることを意味します。内部的にはTypedArray
には配列がほとんどないため、TypedArray
が使用されるたびにメモリを割り当てないためには、staticフィールドとしてResources
クラスにキャッシュされます。あなたはTypedArray.recycle()
メソッドのコードを見ることができます:あなたが呼び出すとき
/**
* Give back a previously retrieved StyledAttributes, for later re-use.
*/
public void recycle() {
synchronized (mResources.mTmpValue) {
TypedArray cached = mResources.mCachedStyledAttributes;
if (cached == null || cached.mData.length < mData.length) {
mXml = null;
mResources.mCachedStyledAttributes = this;
}
}
}
だからrecycle
あなたTypedArray
オブジェクトが戻ったばかりのキャッシュに返されます。
2
@Andrei Mankevich Android SDKの最新バージョンをチェックするだけで、リサイクル()に変更が加えられたようです。以下のコードを確認してください:
/**
* Recycle the TypedArray, to be re-used by a later caller. After calling
* this function you must not ever touch the typed array again.
*/
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;
mResources.mTypedArrayPool.release(this);
}
関連する問題
- 1. エミュレーションをリアルタイムで実行する必要があるのはなぜですか?
- 2. メインでAをインポートする必要があるのはなぜですか?
- 3. Java - aspectjでプラグインをインストールする必要があるのはなぜですか?
- 4. $リソースで$ promiseを使用する必要があるのはなぜですか?
- 5. Junitのテストメソッドを公開する必要があるのはなぜですか?
- 6. @Entityがある場合、なぜ "annotatedClasses"が必要ですか?
- 7. 参照アセンブリを連鎖する必要があるのはなぜですか?
- 8. インターフェイスを再宣言する必要があるのはなぜですか?
- 9. COBOLをインデントする必要があるのはなぜですか?
- 10. java @SafeVarargsプライベートメソッドをfinalにする必要があるのはなぜですか?
- 11. ClassInitializeメソッドを静的にする必要があるのはなぜですか?
- 12. NSObjectを継承する必要があるのはなぜですか?
- 13. SleepでInterruptedExceptionを捕まえる必要があるのはなぜですか?
- 14. @method_decoratorでlogin_requiredデコレータを飾る必要があるのはなぜですか
- 15. ここで二重キャストする必要があるのはなぜですか?
- 16. beforeEach()でspyOnを呼び出す必要があるのはなぜですか?
- 17. Lispの中に# 'を入れる必要があるのはなぜですか?
- 18. `pthread_mutex_trylock`があるときに` pthread_mutex_lock`が必要なのはなぜですか?
- 19. setuptoolsがバイトコードを書き込む必要があるのはなぜですか?
- 20. なぜデータベースラッパーを作成する必要がありますか?
- 21. UIスレッドからSerialDevice.FromIdAsyncを開く必要があるのはなぜですか?
- 22. なぜ?と?を使用する必要があるのはなぜですか?一緒にならずに
- 23. なぜ、テーブル内の行をリロードする必要があるのですか?
- 24. 「自己」はなぜ機能パラメータである必要がありますか?
- 25. AjaxUpload:なぜ2回クリックする必要がありますか?
- 26. なぜhtml_safeに注意する必要がありますか?
- 27. なぜ私は(...)ループでbrowserifyを使用する必要がありますか?
- 28. static getパラメータを書く必要があるのはなぜですか?
- 29. キャッスルアクティブレコードでは、セッションスコープを終了する必要があるときにCreateAndFlushを使用する必要があるのはなぜですか?
- 30. なぜHTMLDivElement.constructor.prototype == HTMLDivElementですか?プロトタイプオブジェクトである必要があります
/** * TypedArrayをリサイクルし、後の呼び出し元が再利用します。 *この関数を呼び出した後、入力された配列に再び触れてはいけません。 */ public void recycle(){ if(mRecycled){ 新しいRuntimeExceptionをスローする(toString()+ "2回リサイクル!"); } mRecycled = true; //これらはクライアントによって設定されている可能性があります。 mXml = null; mTheme = null; mResources.mTypedArrayPool.release(this); } – Sam003