Как передать объект в Java из класса B в класс C через класс A без дублирования - PullRequest
1 голос
/ 21 февраля 2011

Допустим, у меня есть 3 класса.

  • Класс A (расширяет Activity)
    Класс B
    Класс C (расширяет View)

A создаетобъект B, который содержит Bitmap.А также делает недействительным C. 101 * * рисует Bitmap в Canvas.

Как нарисовать Bitmap, который содержит B, не создавая еще один объект Bitmap в C?Обратите внимание, что для меня важно сохранить ту же «структуру классов».

Вот псевдокод.Вы можете видеть, что это помещает 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);
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 21 февраля 2011

Хорошо, имея объявленную в C переменную экземпляра, вы точно не дублируете объект Bitmap в C. У вас просто есть еще одна ссылка на исходный объект Bitmap, который создается в конструкторе B.

1 голос
/ 21 февраля 2011

Полагаю, вы думаете, что следующая строка:

c.passTheBitmap(b.bitmap);

приведет к копированию b.bitmap.Это не так, если b.bitmap не является примитивом.

В вашем коде единственный способ создать вторую копию - это если вы намеренно создадите новый объект с помощью new.

Например, в классе C

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

Если вы сделаете так, как сделали:

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

... тогда Abbitmap и C.bitmap будут ссылаться натот же объект в памяти.

Если это был C ++, то у вас есть действительная проблема - но в Java то, что вы делаете, не делает копию передаваемого объекта.

HTH

...