Android:大型Bitmap对象的内存问题

时间:2013-12-27 02:50:30

标签: android

我知道,很多人已经说过,写过,发出来了;)但我的问题有点不同。我意识到在Android中使用大型位图对象存在问题。在我的Android应用程序中,我需要在各个地方使用大型位图。无法帮助它。我尝试了stackoverflow中列出的各种东西。我想尝试但不能的是避免使用ARBG_8888。应用程序多次在该行崩溃。我有一个ImageView,我加载一个初始的大位图。然后用户可以在位图中做出一些标记,然后我需要保存整个图像(即原始位图+用户的标记)。我尝试使用stackoverflow得到的代码:

public static Bitmap loadBitmapFromView(Context context, View view) {

    Log.d(logtag, "loadBitmapFromView");
    Bitmap bitmap;

    BitmapFactory.Options options = new BitmapFactory.Options();
    // These help in saving/recycling the bitmap memory 
    options.inPurgeable = true;
    options.inInputShareable = true;

    Bitmap dummy = null;
    try {
        dummy = BitmapFactory.decodeStream(context.getAssets().open("icon_add.png"), new Rect(-1,-1,-1,-1), options);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
     bitmap = Bitmap.createBitmap(view.getLayoutParams().width,
        view.getLayoutParams().height, Bitmap.Config.ARGB_8888);
            //  bitmap = Bitmap.createScaledBitmap( dummy, view.getLayoutParams().width,
            //              view.getLayoutParams().height, false);
    Canvas c = new Canvas(bitmap);
    view.layout(0, 0, view.getLayoutParams().width, view.getLayoutParams().height);
    view.draw(c);
    Log.d(logtag, "loadBitmapFromView: width:" + view.getLayoutParams().width);
    c = null;

    return bitmap;
}

如何避免在上面的代码中使用ARGB_8888?有人可以帮忙吗? 我从代码中的许多其他地方删除了它,但是,在上面的代码片段中,我是徒劳的。

我尝试使用一个初始虚拟对象(你可以在上面的代码中看到对象'dummy')来创建一个缩放的位图对象(使用createScaledBitmap(),它必须要求一个源位图),然后尝试加载画布,但生成的图像只有虚拟对象(icon_add.png),而不是imageview中的虚拟对象。

1 个答案:

答案 0 :(得分:0)

您可以在设备特定的高度宽度中显示图像....然后您不会因为图像大小而内存不足。 这是代码:

@SuppressLint("NewApi")
    public static int getDeviceWidth(Activity activity) {
        int deviceWidth = 0;

        Point size = new Point();
        WindowManager windowManager = activity.getWindowManager();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            windowManager.getDefaultDisplay().getSize(size);
            deviceWidth = size.x;
        } else {
            Display display = windowManager.getDefaultDisplay();
            deviceWidth = display.getWidth();
        }
        return deviceWidth;
    }

    @SuppressLint("NewApi")
    public static int getDeviceHeight(Activity activity) {
        int deviceHeight = 0;

        Point size = new Point();
        WindowManager windowManager = activity.getWindowManager();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            windowManager.getDefaultDisplay().getSize(size);
            deviceHeight = size.y;
        } else {
            Display display = windowManager.getDefaultDisplay();
            deviceHeight = display.getHeight();
        }
        return deviceHeight;
    }

您可以使用设备高度和宽度..并在imageview中设置此图片..

ImageView image = new ImageView(viewHomeScreen);
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.FILL_PARENT,
                FrameLayout.LayoutParams.FILL_PARENT);

        params.height = getDeviceHeight(activity);
        params.width = getDevicewidth(activity);
FrameLayout framelayout = new FrameLayout(viewHomeScreen);

        framelayout.addView(image, 0, params);

我希望如果您使用设备特定的高度和宽度,那么您的图像内存问题将得到解决。