5

私は非常に重大な問題を抱えています。Android 4.1 のみ、ビットマップは自動的にリサイクルされます! コードで recycle() を呼び出しませんでした! 私のプロジェクトは、他の OS バージョン (~ 4.0.3) でどの解像度でも問題なく動作します。他のプロジェクトにも同じ問題があります。

すべての画像ファイルは drawable-nodpi フォルダーにあります。常に、どのデバイスの解像度にも合うようにサイズを変更しました。

public Bitmap GetBitmap(int resource){

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inDither = true;
    options.inPurgeable = true;

    Bitmap tmp = null;

    try{
        tmp = BitmapFactory.decodeResource(mResources, resource, options);
    }catch(OutOfMemoryError e){
        options.inSampleSize = 2;
        tmp = BitmapFactory.decodeResource(mResources, resource, options);
    }

    return tmp;
}

public Bitmap GetScaledBitmap(int resource, int width, int height, boolean filter){

    Bitmap tmp = GetBitmap(resource);

    Bitmap img = Bitmap.createScaledBitmap(tmp, width, height, filter);

    tmp.recycle();
    tmp = null;

    return img;
}

私のテストでは、

  • 同じビットマップ インスタンスですが、サイズ変更値によって問題が発生します。

例) int 幅 = 100 ;

ビットマップ imgStar = MyResourceManager.getInstance().GetScaledBitmap(R.drawable.star, width, width , true); -> リサイクルされたインスタンスを返します。

幅= 200 ;

imgStar = MyResourceManager.getInstance().GetScaledBitmap(R.drawable.star, width, width, true); -> 通常のインスタンスを返します。

  • 異なる解像度では、imgStar は正常に動作しますが、問題は他のビットマップ インスタンスで発生します。同様に、サイズ変更値を変更すると、正常に機能します。

  • 同じ解像度で、画像ファイル フォルダーの名前を変更すると、他のビットマップ インスタンスで問題が発生します。drawable-nodpi -> drawable -> drawable-ldpi, ..., drawable-xdpi.

  • サイズ変更の値は同じですが、他のリソース ID を指定しても問題なく動作します。元)

int 幅 = 100;

Bitmap imgStar = MyResourceManager.getInstance().GetScaledBitmap(R.drawable.star , width, width , true); -> リサイクルされたインスタンスを返します。

imgStar = MyResourceManager.getInstance().GetScaledBitmap(R.drawable. diamond , width, width, true); -> 通常のインスタンスを返します。

お願い…どうすればいいの!? T^T

4

3 に答える 3

6

異なるサイズで異なる結果が得られる理由は、スケーリング先のサイズが同じ場合、 createScaledBitmap が元のオブジェクトを返すためである可能性があります。

私はあなたと同じことをして、同じ問題を抱えていました。私はこの方法でそれを修正することができました:

public Bitmap GetScaledBitmap(int resource, int width, int height, boolean filter) {

    Bitmap tmp = GetBitmap(resource);
    Bitmap img = Bitmap.createScaledBitmap(tmp, width, height, filter);
    //copy the image to be sure you are not using the same object as the tmp bitmap
    img=img.copy (Bitmap.Config.RGB_565,false);
    tmp.recycle();
    tmp = null;
    return img;
}

ここでは、ビットマップをコピーして、tmp ビットマップをリサイクルする前に、単に tmp ビットマップ オブジェクトへの参照ではないことを確認しました。もちろん、必要なビットマップ構成を使用できます。

于 2012-12-06T01:34:22.807 に答える
0

リサイクルする前に、ビットマップがすでにリサイクルされているかどうかを確認することをお勧めします。

if (!tmp.isRecycled()) tmp.recycle();
于 2013-01-09T15:58:36.280 に答える