8
respostas

OutOfMemoryError x loadAd(adRequest) x AdActivity

Boa noite.

Alguém conhece a class AdActivity? E alguém sabe se posso usá-la sem problemas com finish()?

Context acontext = null; AdActivity adActivity = (AdActivity) acontext; adActivity.finish();

Estou com problemas de 'OutOfMemoryError' que ocorre quando não chamo o 'anuncioView.loadAd(adRequest)' e depois reinicio o app.

Alguém pode me ajudar?

Valeu.

8 respostas

Julius, o OutOfMemoryError (vulgarmente conhecido como OOM) pode ocorrer por inúmeros motivos. Mesmo que o stacktrace acuse que o problema foi em um método, a gente fica sem saber quem exatamente foi o campeão de comer memória.

Consegue dar mais detalhes? Ele dá OOM mesmo se você reinicia a app do zero?

Posta o seu método/callback implementado nesse AdActivity

Paulo, obrigado pela resposta. Depois que reinicio o app com o código abaixo

Game.class implements Runnable
...
if(passaroMortoNoChao) {
                        mainActivity.removeAnuncio();
                        runningfalse();
                        mainActivity.jogoReiniciado = true;
                        MainActivity.nivelDeJogoFacil = true;
                        mainActivity.removeViewDaTela();
                        mainActivity.thread.interrupt();
                        MainActivity.jogoIniciadoNaTelaView = true;
                        botoesNivelDeJogoAtivados = true;

                        Intent intent = mainActivity.getIntent();
                        mainActivity.finish();
                        mainActivity.startActivity(intent);
                    }
MainActivity.class 
...
@Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        inicializa();

        relativeLayout = (RelativeLayout) findViewById(R.id.relative_layout);
        frameLayout = (FrameLayout) findViewById(R.id.frame_layout);
        anuncioView = (AdView) findViewById(R.id.adview_anuncio);

        this.game = new Game(this);
        frameLayout.addView(game);

        AdRequest adRequest = new AdRequest.Builder().build();

//QUANDO USO ESSA LINHA DÁ ERRO DE MEMÓRIA 
        anuncioView.loadAd(adRequest);

        som = game.getSom();
    }

    public void removeAnuncio() {
        if(!anuncioRemovido) {
//            anuncioView.destroy();
//            anuncioView.invalidate();
            relativeLayout.removeView(anuncioView);
            anuncioRemovido = true;
        }
    }

Uso muitas imagens (bitmap) no app.

Usei a linha abaixo no Manifest, mas apesar de não dar mais erro a memória parece que acumula e o app fica lento.

android:largeHeap="true"

Pensei em tentar usar o código abaixo, mas não sei o que isso pode causar, pois não encontrei nada sobre ele na internet

Context acontext = null;
AdActivity adActivity = (AdActivity) acontext;
adActivity.finish();

O que acha?

Obrigado.

Acho que certamente o volume grande de bitmaps deve estar exagerado na memoria, fazendo o garbage collector trabalahr demais, ou até mesmo a OOM.

Troque os bitmaps por imagens minusculas temporariamente, só para confirmar que é esse o problema. Se for, vai precisar mesmo trabalhar de uma forma sem tantos recursos :(

Posta a stacktrace do seu erro.

07-01 10:02:58.648 9185-9185/wingbirds E/AudioTrack: AudioTrack::set : Exit
07-01 10:03:14.093 9185-9185/wingbirds E/art: Throwing OutOfMemoryError "Failed to allocate a 1402520 byte allocation with 650296 free bytes and 635KB until OOM"
07-01 10:03:14.093 9185-9185/wingbirds E/AndroidRuntime: FATAL EXCEPTION: main
Process: wingbirds, PID: 9185
java.lang.OutOfMemoryError: Failed to allocate a 1402520 byte allocation with 650296 free bytes and 635KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:726)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:547)
at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:575)
at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:605)
at wingbirds.elements.Predios.bitmap(Predios.java:77)
at wingbirds.elements.Predios.inicializa(Predios.java:67)
at wingbirds.elements.Predios.<init>(Predios.java:46)
at wingbirds.engine.Game.inicializaElementos(Game.java:195)
at wingbirds.engine.Game.<init>(Game.java:123)
at wingbirds.MainActivity.onCreate(MainActivity.java:41)
at android.app.Activity.performCreate(Activity.java:6289)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2655)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767)
at android.app.ActivityThread.access$900(ActivityThread.java:177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5951)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
07-01 10:03:22.861 13128-13128/wingbirds E/AudioTrack: AudioTrack::set : Exit

Tenho muitos bitmaps no código. Qual é a melhor forma de tratá-los? Talvez assim possa resolver esse tipo de problema.

Julius, aqui tem um método que voce pode usar pra chutar quanto de memoria cada bitmap seu vai usar:

https://developer.android.com/training/displaying-bitmaps/load-bitmap.html

é o calculateInSampleSize

aí veja quem são os vilões. nesse artigo ele dá algumas dicas de como você pode fazer para loadar só parte do bitmap. Mas realmente vai ter caso que não terá jeito e a memória será um limitador.... em especial para os celulares com menos recursos

Geralmente, pela descrição do seu problema, você está instanciando novos elementos de jogo dentro de algum loop. Por isso seu jogo fica lento conforme o tempo passa.

Olhando a stacktrace do seu erro, vemos que o problema está aqui:

at wingbirds.elements.Predios.bitmap(Predios.java:77)
at wingbirds.elements.Predios.inicializa(Predios.java:67)
at wingbirds.elements.Predios.<init>(Predios.java:46)
at wingbirds.engine.Game.inicializaElementos(Game.java:195)
at wingbirds.engine.Game.<init>(Game.java:123)

Posta pra mim os códigos das classes Game e Predios.