2012-09-30 9 views
5

Errore:Come risolvere OutOfMemoryError utilizzando LayerDrawable

java.lang.OutOfMemoryError 
at android.graphics.Bitmap.nativeCreate(Native Method) 
at android.graphics.Bitmap.createBitmap(Bitmap.java:605) 
at android.graphics.Bitmap.createBitmap(Bitmap.java:551) 
at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437) 
at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:618) 
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:593) 
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:445) 
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:775) 
at android.content.res.Resources.loadDrawable(Resources.java:1968) 
at android.content.res.Resources.getDrawable(Resources.java:677) 
at android.widget.ImageView.resolveUri(ImageView.java:542) 
at android.widget.ImageView.setImageResource(ImageView.java:315) 
at app.Main.GridActivity.initaliseLevel(GridActivity.java:245) 
at app.Main.GridActivity.load_player_settings(GridActivity.java:180) 
at app.Main.GridActivity.onResume(GridActivity.java:79) 
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1158) 
at android.app.Activity.performResume(Activity.java:4607) 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2448) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2486) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2000) 
at android.app.ActivityThread.access$600(ActivityThread.java:128) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4517) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
at dalvik.system.NativeStart.main(Native Method) 

Le immagini sono stabiliti dal:

ImageButton b0 = (ImageButton) findViewById(R.id.ImageButton00); 
Resources r = getResources(); 
Drawable[] layers = new Drawable[2]; 
layers[0] = r.getDrawable(R.drawable.image); 
layers[1] = r.getDrawable(R.drawable.imagetwo); 
LayerDrawable layerDrawable = new LayerDrawable(layers); 
b0.setImageDrawable(layerDrawable); 

Da leggere altre risposte, ho capito che le immagini devono essere riciclati dopo l'uso. Questa è l'opzione migliore? In tal caso, come può un LayerDrawable essere convertito in una bitmap, in modo che possa essere riciclato?

+0

Qual è la dimensione (larghezza x altezza) dell'immagine che si sta cercando di caricare? – dumbfingers

+0

Ci sono circa 25 layerDrawables tutti 175x175px e formati da 2-3 strati – Isaac

+0

Sto ottenendo qualcosa di simile. Immagini abbastanza piccole. Se commento tutte tranne una immagine, nessun problema, ma tutto il resto lo blocca. Ci sono impostazioni di opacità sulla prima immagine ... non sono sicuro se ciò sta causando questo? – RiddlerDev

risposta

2

Nella sezione manifest> Attributi dell'applicazione è presente un'impostazione "Grande heap", selezionare la propria attività nei Nodi applicazione e quindi selezionare "true" nelle Impostazioni heap che mi sono state d'aiuto fino a quando non ho risolto la perdita.

e anche io ho questo nella mia attività:

private void unbindDrawables(View view) { 
    if (view.getBackground() != null) { 
     view.getBackground().setCallback(null); 
    } 
    if (view instanceof ViewGroup) { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
      unbindDrawables(((ViewGroup) view).getChildAt(i)); 
     } 
     ((ViewGroup) view).removeAllViews(); 
    } 
} 

    @Override 
protected void onDestroy() { 
    super.onDestroy(); 

    unbindDrawables(findViewById(R.id.nameslayout)); 
    System.gc(); 
} 

hop che aiuta

+0

You sir rock! Questo mi ha permesso di essere in grado di caricare il mio schermo sul mio telefono in modo da poter continuare a ottimizzare. Per essere sicuro di aggiungere anche il tuo materiale GC dato che sembra buono. Grazie! – RiddlerDev

+0

Sono contento di essere stato in grado di aiutare !!! –