2011-01-02 4 views

答えて

5

私はSoftReferenceを使用してハッシュマップ内のビットマップを保存する場合、ビットマップ上.recycle()を呼び出すSoftReferenceのだろうか?

代わりBitmapのあなたがStringやPOJOを保存する場合は何番?彼らはrecycleメソッドを持っていますか?もちろん、いいえ。ですから、質問は:SoftReferenceは何ですか?

あなたがホストプロセスは、メモリが不足してまで、参照されるオブジェクトが生きて滞在したいときは、SoftReferenceを使用しています。コレクタがメモリを解放するためにを必要とするまで、オブジェクトは収集の対象になりません。大まかに言えば、SoftReferenceをバインドするということは、「あなたがもうできなくなるまでオブジェクトを固定する」という意味です。 (link

あなたは(recycleメソッドを呼び出す)ビットマップのクリアを気にする必要はありません。 SoftReferenceにその作業をさせてください。 Bitmap.recycleドキュメントから

+5

romainguyのコメントが見つかりませんでした。ビットマップをクリアするには.recycle()を呼び出す必要がありました。そうしないと、android-devの人に尋ねれば、メモリ問題が発生します。 .recycle()を呼び出さずに問題が出現する – 2cupsOfTech

+0

私は2cupsOfTechに同意します。あなたは間違いなくビットマップ上でリサイクルを呼び出さなければなりませんが、ドキュメンテーションはそれとは逆です。さもなければヒープサイズの小さなデバイスで問題が発生します。 – Apfelsaft

6

:だから

This is an advanced call, and normally need not be called, 
since the normal GC process will free up this memory when there 
are no more references to this bitmap. 

、弱いビットマップを保持するのには十分です。なんらかの理由で、このリソースを積極的に解放する必要がある場合、弱い参照があります。

EDIT

私はアンドロイドでビットマップの実装に慣れていないんだけど、何がビットマップのリソースに対処するための力のいずれかが明示的にいくつかのメモリをヒープ上に作成されていないという事実であることが起こるかもしれません。 GCを必要とせずにプロセスがメモリ不足になる可能性があります。他の場所から大量のメモリチャンクを保持している小さなオブジェクトを想像してみてください。オブジェクトのファイナライズはメモリを解放する準備ができていますが、VMがGCになる理由はないので、ネイティブメモリは "失われています"。

しかし、弱い参照は、gcの後でのみ処理されるため、弱い参照は役に立ちません。ここで役立つのは、参照カウントの助けを借りて明示的に "リサイクル"することだけです。

+0

私はこれに同意しますが、カスタム作業なしでうまくいくはずです。 –

+0

Bitmapクラスから継承し、finalize()をオーバーライドする方法はありますか? – 2cupsOfTech

+0

どうすればいいですか?ドキュメントに記載されているように、GCはリソースを解放します。ファイナライズは何もしません(オーバーヘッドを追加します)。あなたの意図は何ですか? – mtraut

-1

WeakReferenceによって参照されるオブジェクトがGCになる場合は、ビットマップ上でリサイクルメソッドをトリガーすると仮定します。しかし、私は確信が持てません。ちょうど安全な側にいるために、WeakReferenceクラスをオーバーライドするようなやり方でBitmap固有のWeakReferenceクラスを作成して、refrence時にリサイクルメソッドを呼び出すクラスをGCします。

ソリューションは、このような何かをOOKなければならないが、それは未テストです:

private final class WeakBitmapReference extends WeakReference<Bitmap> { 
    public WeakBitmapReference(Bitmap b) { 
     super(b); 
    } 

    public void clear() { 
     Bitmap b = get(); 
     if (b != null && !b.isRecycled()) 
      b.recycle(); 
     super.clear(); 
    } 
} 
+0

これはうまくいきません。 VMはいつでも「クリア」を呼び出すことはありません。参照キューに追加すると、 "get"は結果を返さなくなるため、どちらも機能しません。 – mtraut

+0

ちょうど私の答えを無視して、mtrautはとにかく正しいです; p –

0

ビットマップの関連するリソースはGC時に解放されます、それのおかげでfinalize()方法です。 recycle()は、もはや必要ではないことが分かっている場合には、それを待たずにリソースを解放することです。メモリが不足している場合は、画像をリサイクルするため、SoftReferenceを使用します。

関連する問題