2014-06-10 8 views
5

Sto cercando di realizzare un'animazione su un pulsante click .. i passi sono i seguenti sul pulsante click ..java.lang.OutOfMemoryError a android.graphics.BitmapFactory.nativeDecodeAsset (metodo natale)

  1. l'immagine del pulsante cambia
  2. un'animazione gioca viene visualizzato
  3. prossimo disposizione ..

Ma sto ottenendo un'eccezione di memoria ..

Quando il file di animazione non è stato aggiunto al progetto, non si sono verificati errori. Ma dall'aggiunta dell'anime c'è il problema.

Sto usando 3 file di classe qui (home_screen, button_anime e casa)

home_screen.java riceve il pulsante cliccare informazioni, cambia l'immagine del pulsante e trasferimenti per button_anime classe il file di animazione è iniziato nel button_anime.java e dopo anime gioca layout successivo viene visualizzato da home.java

Il gatto di registro è il seguente ..

E/AndroidRuntime(1255): java.lang.OutOfMemoryError 
E/AndroidRuntime(1255): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
E/AndroidRuntime(1255): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587) 
E/AndroidRuntime(1255): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422) 
E/AndroidRuntime(1255): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840) 
E/AndroidRuntime(1255): at android.content.res.Resources.loadDrawable(Resources.java:2110) 
E/AndroidRuntime(1255): at android.content.res.Resources.getDrawable(Resources.java:700) 
E/AndroidRuntime(1255): at android.graphics.drawable.AnimationDrawable.inflate(AnimationDrawable.java:282) 
E/AndroidRuntime(1255): at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937) 
E/AndroidRuntime(1255): at android.graphics.drawable.Drawable.createFromXml(Drawable.java:877) 
E/AndroidRuntime(1255): at android.content.res.Resources.loadDrawable(Resources.java:2092) 
E/AndroidRuntime(1255): at android.content.res.Resources.getDrawable(Resources.java:700) 
E/AndroidRuntime(1255): at android.view.View.setBackgroundResource(View.java:15303) 
E/AndroidRuntime(1255): at com.quinoid.thomasinternational.Button_Anime.onCreate(Button_Anime.java:19) 
E/AndroidRuntime(1255): at android.app.Activity.performCreate(Activity.java:5231) 
E/AndroidRuntime(1255): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
E/AndroidRuntime(1255): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
E/AndroidRuntime(1255): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
E/AndroidRuntime(1255): at android.app.ActivityThread.access$800(ActivityThread.java:135) 
E/AndroidRuntime(1255): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
E/AndroidRuntime(1255): at android.os.Handler.dispatchMessage(Handler.java:102) 
E/AndroidRuntime(1255): at android.os.Looper.loop(Looper.java:136) 
E/AndroidRuntime(1255): at android.app.ActivityThread.main(ActivityThread.java:5017) 
E/AndroidRuntime(1255): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(1255): at java.lang.reflect.Method.invoke(Method.java:515) 
E/AndroidRuntime(1255): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
E/AndroidRuntime(1255): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
E/AndroidRuntime(1255): at dalvik.system.NativeStart.main(Native Method) 

mio home_screen.java

0.123.516,410617 millions
home.setOnClickListener(new OnClickListener() { <-- error happens somewhere here 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.home1); 
     Drawable d = new BitmapDrawable(getResources(),b); 
     home.setBackgroundDrawable(d); <-- this dose not work.. 
     Intent myIntent = new Intent(Home_Screen.this, Button_Anime.class); 
     startActivity(myIntent); 
    } 
}); 
+0

Hai esaurito la memoria. Potrebbe essere che la bitmap sia troppo grande, potrebbe darsi che tu abbia una perdita altrove. È necessario esaminare l'utilizzo della memoria in un heap profiler per sapere cosa sta succedendo. –

+0

tutte le mie immagini sono btw 30kb e 50kb .. quindi come faccio a controllare il mio heap rofiler ?? @ GabeSechan – user3214173

+0

C'è uno costruito in eclissi. Dovresti cercare i numeri in fuga di alcune allocazioni di classe o di grandi dimensioni che non hanno senso. –

risposta

0

si dovrebbe usare decodeResource(Resources res, int id, BitmapFactory.Options opts), e specificare il inSampleSize -

Se impostato su un valore> 1, chiede al decoder per sottocampionare l'immagine originale , restituendo un'immagine più piccola per risparmiare memoria.

+0

dove dovrei usare Questo?? puoi fornire un esempio? anche il valore SampleSize è la dimensione in kb ?? o dimensioni ?? @yushulx – user3214173

+0

Bitmap b = BitmapFactory.decodeResource (getResources(), R.drawable.home1, opts); ad esempio, inSampleSize == 4 restituisce un'immagine che è 1/4 della larghezza/altezza dell'originale e 1/16 il numero di pixel. – yushulx

4

_img è la tua imageview. devi decodificare la tua immagine e impostare le sue dimensioni come di seguito sto facendo.

File imgFile = new File(_path); // path of your file 
    if (imgFile.exists()) { 
     FileInputStream fis = new FileInputStream(imgFile); 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 8; 
     options.inPurgeable = true; 
     options.inScaled = true; 
     Bitmap bm = BitmapFactory.decodeStream(fis, null,options); 
     _img.setImageBitmap(bm); 
+0

posso sapere il motivo del downvote? – Dev

+0

Votato.Questo sembra ruotare il mio problema, ma penso che ci sia ancora una perdita di memoria – Eagle

+0

Very goood. continuate così –