假设我有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中,您所做的事情不会复制所传递的对象。
高温超导