Android中Bitmap回收问题
阿神
阿神 2017-04-17 17:35:07
0
5
551

使用Bitmap的静态方法createScaledBitmap来创建一个符合规格的Bitmap的时候,原生的bitmap是否需要回收?

代码如下:

private void initDragBitmap() {
    Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.mingren);
    mDragBitmap = Bitmap.createScaledBitmap(srcBitmap, FLOAT_BALL_WIDTH, FLOAT_BALL_HEIGHT, true);
    srcBitmap.recycle();
}

代码中srcBitmap是否需要回收?


补充问题:

看了大家的回复,基本可以确定如果srcBitmap后续不再使用了,确实是可以手动recycle的,同时它本身也是个局部变量,是可以等待系统GC的。

那新问题来了(或者说我最初想问的问题来了),当createScaledBitmap方法中传入的宽和高跟srcBitmap相同时,通过createScaledBitmap代码注释可以看出它是将srcBitmap返回了,这个时候我强行recycle了srcBitmap,会不会导致mDragBitmap也为null?

源码注释:

    /**
     * Creates a new bitmap, scaled from an existing bitmap, when possible. If the
     * specified width and height are the same as the current width and height of
     * the source bitmap, the source bitmap is returned and no new bitmap is
     * created.
     *
     * @param src       The source bitmap.
     * @param dstWidth  The new bitmap's desired width.
     * @param dstHeight The new bitmap's desired height.
     * @param filter    true if the source should be filtered.
     * @return The new scaled bitmap or the source bitmap if no scaling is required.
     * @throws IllegalArgumentException if width is <= 0, or height is <= 0
     */
    public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, int dstHeight,
            boolean filter) {
            }
阿神
阿神

闭关修行中......

全員に返信(5)
巴扎黑

もちろん、GC がリサイクルするのを待つこともできます。これは、手動でリサイクルするのと同じように良い習慣です。

答え:

はい、2 つの参照が同じオブジェクトである場合、recycle を使用すると、オブジェクト内の画像がクリーンアップされます。ただし、クリーンアップされるのはオブジェクト自体ではなく、オブジェクト内の画像データであるため、mDragBitmap は null にはなりませんが、mDragBitmap 内の画像データを使用するとエラーが報告されます。

ここで判断してリサイクルできます:

リーリー
いいねを押す +0
PHPzhong

これ以上操作が行われないことが確実な場合は、その recycler メソッドを呼び出してメモリを解放できます。その後に getPixels()setPixels() を呼び出す場合は、任意にメモリを解放しないでください。 GC のリサイクルを待ちます。そうしないと例外がスローされます。

いいねを押す +0
PHPzhong

private void initDragBitmap() {

リーリー

}

上記のコードに関して質問したいのですが、srcBitmap=null を使用して gc にできるだけ早くリサイクルさせることはできますか?

いいねを押す +0
小葫芦

リーリー

いいねを押す +0
小葫芦

現在の主流バージョンでは、GoogleBitmap のメモリをヒープに置き、リサイクルは gc に引き継がれているため、投稿者はこの問題を考慮する必要がありません。メモリが不足した場合は、自動的に再利用されます。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート