java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)

别说谁变了你拦得住时间么 提交于 2019-12-23 10:06:57

问题


I am trying to perform an animation on a button click.. the steps are as follows on button click..

  1. the button image changes
  2. an animation plays
  3. next layout is displayed..

But am getting an out of memory exception..

When the animation file was not added to the project there was no error. But since the addition of the anime there is the problem.

I am using 3 class files here(home_screen, button_anime and home)

home_screen.java receives the button click information, changes the button image and transfers to button_anime class the animation file is initiated in the button_anime.java and after anime plays next layout is displayed from home.java

The log cat is as follows..

 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)

My home_screen.java

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);
    }
});

回答1:


_img is your imageview. you have to decode your image and set its size like below i am doing.

 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);



回答2:


You should use decodeResource(Resources res, int id, BitmapFactory.Options opts), and specify the inSampleSize -

If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory.



来源:https://stackoverflow.com/questions/24134270/java-lang-outofmemoryerror-at-android-graphics-bitmapfactory-nativedecodeassetn

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!