Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Bitmap x memória

Olá.

No exemplo abaixo, a memória vai encher de objetos ou será apenas um (01) objeto criado na memória? Tem alguma desvantagem nesse código? Está correto fazer dessa forma?

private int arquivoDeImagem;

private Bitmap bitmap() 
{
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), arquivoDeImagem);
        return (Bitmap.createScaledBitmap(bitmap, width, height, false));
} 


// CHAMADO NO RUN (runnable - desenhaNo(canvas))
public void desenhaNo(Canvas canvas) 
{
    if(condicao) 
    { arquivoDeImagem = R.drawable.objeto1; }
    else 
    { arquivoDeImagem = R.drawable.objeto2; }           

    canvas.drawBitmap(bitmap(), floatLeft, floatTop, null);
}
1 resposta
solução!

Sempre que você chama BitmapFactory.decodeResource um novo bitmap é criado. Logo, no seu exemplo, vários bitmaps serão criados na memória e essa é uma grande desvantagem.

Uma ideia é fazer uma verificação para saber se o bitmap já foi criado anteriormente:

public class MeuBitmap {
    private int arquivoDeImagem;

    public MeuBitmap(int arquivoDeImagem) {
        this.arquivoDeImagem = arquivoDeImagem;
    }

    public int getTipo() {
        return this.arquivoDeImagem;
    }

    public Bitmap cria() {
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), arquivoDeImagem);
        return Bitmap.createScaledBitmap(bitmap, width, height, false);
    }
}
private Bitmap bp;

public void desenhaNo(Canvas canvas) {
    if(condicao) {
        if(bp != null && bp.getTipo() != R.drawable.objeto1) {
            bp = new MeuBitmap(R.drawable.objeto1).cria(); 
        }
    } else { 
        if(bp != null && bp.getTipo() != R.drawable.objeto2) {
            bp = new MeuBitmap(R.drawable.objeto2).cria(); 
        }
    } 
    canvas.drawBitmap(bp, floatLeft, floatTop, null);
}

Fiz o código direto no editor do Alura, mas algo assim deve resolver.

Uma outra ideia é tentar fazer algo parecido com um singleton, mas pra evitar complicar muito, tente esse código primeiro.