假设我有3个班级。


A类(扩展活动)
B级
C类(扩展视图)


A创建一个保存Bitmap的B对象。 A也使C无效。C的onDraw为其Bitmap绘制Canvas

我如何绘制B持有的Bitmap而不在C中创建另一个Bitmap对象?请注意,对我而言,保持相同的“类结构”很重要。

这是伪代码。您可以看到这会将2个Bitmap对象放入内存。谢谢!

public class A extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        B b = new B();
        C c = (C) findViewById(R.id.c);

        c.passTheBitmap(b.bitmap);
        c.postInvalidate();
    }
}

public class B {
    public Bitmap bitmap;
    public B(){
        bitmap = BitmapFactory.decodeResource(ActivityAContext.getResources(), R.drawable.fooBitmap);
    }
}

public class C extends View {
    public Bitmap bitmap;

    public C(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public passTheBitmap(Bitmap b) {
        bitmap = b;
    }
    @Override
    public void onDraw(Canvas canvas) {
        if (bitmap != null) {
            canvas.drawBitmap(bitmap, 0, 0, null);
        }
    }
}

最佳答案

我认为您认为以下行:

c.passTheBitmap(b.bitmap);


将导致b.bitmap被复制。只要b.bitmap不是原始元素,它就不会。

在您的代码中,唯一拥有第二个副本的方法是使用new故意创建一个新对象。

例如。在C类中

public passTheBitmap(Bitmap b) {
    bitmap = new Bitmap(b);
}


如果您按已做的那样做:

public passTheBitmap(Bitmap b) {
    bitmap = b;
}


...然后A.b.bitmap和C.bitmap将引用内存中的同一对象。

如果这是C ++,那么您有个很在意的问题-但是在Java中,您所做的事情不会复制所传递的对象。

高温超导

07-24 19:04
查看更多