1

Check this MOCKUP of my application : Mockup


PROBLEM :

If I click on SECOND PAGE button from FIRST PAGE, it open new intent of SECOND PAGE

Then

I click on THIRD PAGE button from SECOND PAGE, then it goes to THIRD PAGE

Then

I again goes to FIRST PAGE by using FIRST PAGE BUTTON then CRASH THE APPLICATION by giving below error "Out of memory on ...."


ERROR :

05-13 11:35:06.417: D/dalvikvm(11948): GC_BEFORE_OOM freed 9K, 19% free 39660K/48583K, paused 36ms, total 36ms
05-13 11:35:06.417: E/dalvikvm-heap(11948): Out of memory on a 8684816-byte allocation.
05-13 11:35:06.425: I/dalvikvm(11948): "main" prio=5 tid=1 RUNNABLE
05-13 11:35:06.425: I/dalvikvm(11948):   | group="main" sCount=0 dsCount=0 obj=0x40f01508 self=0x40d41a18
05-13 11:35:06.425: I/dalvikvm(11948):   | sysTid=11948 nice=0 sched=0/0 cgrp=apps handle=1074921264
05-13 11:35:06.425: I/dalvikvm(11948):   | schedstat=( 5318603531 1290588360 5684 ) utm=446 stm=85 core=0
05-13 11:35:06.425: I/dalvikvm(11948):   at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-13 11:35:06.425: I/dalvikvm(11948):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:592)
05-13 11:35:06.425: I/dalvikvm(11948):   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:445)
05-13 11:35:06.425: I/dalvikvm(11948):   at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:781)
05-13 11:35:06.425: I/dalvikvm(11948):   at android.content.res.Resources.loadDrawable(Resources.java:1963)
05-13 11:35:06.425: I/dalvikvm(11948):   at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
05-13 11:35:06.425: I/dalvikvm(11948):   at android.view.View.<init>(View.java:3443)
05-13 11:35:06.425: I/dalvikvm(11948):   at android.view.View.<init>(View.java:3376)
05-13 11:35:06.425: I/dalvikvm(11948):   at android.view.ViewGroup.<init>(ViewGroup.java:426)
05-13 11:35:06.425: I/dalvikvm(11948):   at android.widget.RelativeLayout.<init>(RelativeLayout.java:184)
05-13 11:35:06.425: I/dalvikvm(11948):   at java.lang.reflect.Constructor.constructNative(Native Method)
05-13 11:35:06.425: I/dalvikvm(11948):   at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-13 11:35:06.433: I/dalvikvm(11948):   at android.view.LayoutInflater.createView(LayoutInflater.java:587)
05-13 11:35:06.433: I/dalvikvm(11948):   at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-13 11:35:06.433: I/dalvikvm(11948):   at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
05-13 11:35:06.433: I/dalvikvm(11948):   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
05-13 11:35:06.433: I/dalvikvm(11948):   at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
05-13 11:35:06.433: I/dalvikvm(11948):   at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-13 11:35:06.433: I/dalvikvm(11948):   at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-13 11:35:06.433: I/dalvikvm(11948):   at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
05-13 11:35:06.433: I/dalvikvm(11948):   at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
05-13 11:35:06.433: I/dalvikvm(11948):   at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
05-13 11:35:06.433: I/dalvikvm(11948):   at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:306)
05-13 11:35:06.433: I/dalvikvm(11948):   at android.app.Activity.setContentView(Activity.java:1912)
05-13 11:35:06.440: I/dalvikvm(11948):   at com.mca.LastingPowerActivity.onCreate(LastingPowerActivity.java:24)
05-13 11:35:06.440: I/dalvikvm(11948):   at android.app.Activity.performCreate(Activity.java:5163)
05-13 11:35:06.440: I/dalvikvm(11948):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
05-13 11:35:06.440: I/dalvikvm(11948):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061)
05-13 11:35:06.440: I/dalvikvm(11948):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122)
05-13 11:35:06.440: I/dalvikvm(11948):   at android.app.ActivityThread.access$600(ActivityThread.java:140)
05-13 11:35:06.440: I/dalvikvm(11948):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228)
05-13 11:35:06.440: I/dalvikvm(11948):   at android.os.Handler.dispatchMessage(Handler.java:99)
05-13 11:35:06.440: I/dalvikvm(11948):   at android.os.Looper.loop(Looper.java:137)
05-13 11:35:06.440: I/dalvikvm(11948):   at android.app.ActivityThread.main(ActivityThread.java:4895)
05-13 11:35:06.440: I/dalvikvm(11948):   at java.lang.reflect.Method.invokeNative(Native Method)
05-13 11:35:06.440: I/dalvikvm(11948):   at java.lang.reflect.Method.invoke(Method.java:511)
05-13 11:35:06.440: I/dalvikvm(11948):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
05-13 11:35:06.440: I/dalvikvm(11948):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
05-13 11:35:06.440: I/dalvikvm(11948):   at dalvik.system.NativeStart.main(Native Method)
05-13 11:35:06.440: D/skia(11948): --- decoder->decode returned false
05-13 11:35:06.440: D/AndroidRuntime(11948): Shutting down VM
05-13 11:35:06.440: W/dalvikvm(11948): threadid=1: thread exiting with uncaught exception (group=0x40f002a0)
05-13 11:35:06.456: E/AndroidRuntime(11948): FATAL EXCEPTION: main
05-13 11:35:06.456: E/AndroidRuntime(11948): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mca/com.mca.LastingPowerActivity}: android.view.InflateException: Binary XML file line #18: Error inflating class <unknown>
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.app.ActivityThread.access$600(ActivityThread.java:140)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.os.Looper.loop(Looper.java:137)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.app.ActivityThread.main(ActivityThread.java:4895)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at java.lang.reflect.Method.invokeNative(Native Method)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at java.lang.reflect.Method.invoke(Method.java:511)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at dalvik.system.NativeStart.main(Native Method)
05-13 11:35:06.456: E/AndroidRuntime(11948): Caused by: android.view.InflateException: Binary XML file line #18: Error inflating class <unknown>
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.view.LayoutInflater.createView(LayoutInflater.java:613)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:306)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.app.Activity.setContentView(Activity.java:1912)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at com.mca.LastingPowerActivity.onCreate(LastingPowerActivity.java:24)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.app.Activity.performCreate(Activity.java:5163)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061)
05-13 11:35:06.456: E/AndroidRuntime(11948):    ... 11 more
05-13 11:35:06.456: E/AndroidRuntime(11948): Caused by: java.lang.reflect.InvocationTargetException
05-13 11:35:06.456: E/AndroidRuntime(11948):    at java.lang.reflect.Constructor.constructNative(Native Method)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.view.LayoutInflater.createView(LayoutInflater.java:587)
05-13 11:35:06.456: E/AndroidRuntime(11948):    ... 26 more
05-13 11:35:06.456: E/AndroidRuntime(11948): Caused by: java.lang.OutOfMemoryError
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:592)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:445)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:781)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.content.res.Resources.loadDrawable(Resources.java:1963)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.view.View.<init>(View.java:3443)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.view.View.<init>(View.java:3376)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.view.ViewGroup.<init>(ViewGroup.java:426)
05-13 11:35:06.456: E/AndroidRuntime(11948):    at android.widget.RelativeLayout.<init>(RelativeLayout.java:184)
05-13 11:35:06.456: E/AndroidRuntime(11948):    ... 29 more

If anybody knows then share your answers, so that I can resolve it.

Thank you.

Darshak
  • 2,298
  • 4
  • 23
  • 45
  • use Runtime.getRuntime().gc() for memoryoutofbound or override onDestroy() .. – Sam May 14 '13 at 06:51
  • Set background to your layout in onResume() and unbind the drawable from your layout in onPause() of every activity. You can check this link for loading bitmaps efficiently http://developer.android.com/training/displaying-bitmaps/load-bitmap.html – Raghunandan May 14 '13 at 06:53
  • Do you have versions of your background images in all drawable-?dpi folders? – Voicu May 14 '13 at 06:55
  • @Voicu I am using one High-Quality image for all layouts 320dp,360dp,600dp and 800dp. – Darshak May 14 '13 at 06:58
  • @Voicu in drawable-mdpi – Darshak May 14 '13 at 07:03
  • I believe the large images you put in drawable-mdpi will be scaled up when running the app on a device with higher density (hdpi, xhdpi, xxhdpi), hence the posibility of `OutOfMemoryError`. – Voicu May 14 '13 at 07:06
  • @Voicu but I give them fixed height/width for all different layouts, and also give the supports-screens like below ... – Darshak May 14 '13 at 07:08
  • `android:resizeable="false"` is deprecated, so I'd not count on that. Regarding the fixed height/width, I don't know when scaling is performed by the system, so can't answer that. – Voicu May 14 '13 at 07:27
  • 2
    No problem. But it's written here though: http://developer.android.com/guide/topics/manifest/supports-screens-element.html. _This attribute is deprecated. It was introduced to help applications transition from Android 1.5 to 1.6, when support for multiple screens was first introduced. You should not use it._ – Voicu May 14 '13 at 07:38
  • @Darshak: can you show me code how you are displaying image ? – MAC May 17 '13 at 16:55

5 Answers5

0

Ensure that you are reusing activities from application's stack and not creating a new instance of an Activity every time. If that is not the case then the application's stack will surely run out of memory.

mobidev7
  • 61
  • 1
  • 3
0

I am also facing same problem and what I am doing is following.

When your activity leave its state and go to other activity, it calls "onStop()" after successfully start activity2. So do this

@Override
protected void onStop() 
{
    relativeLayout.setBackgroundDrawable(null);
}

When you close your activity2 and come back to activity1, "onResume() will call. So do this,

@Override
protected void onResume() 
{
    relativeLayout.setBackgroundResource(R.drawable.home_bg);
}

This will solve your problem.

Chintan Rathod
  • 25,864
  • 13
  • 83
  • 93
  • Ok, I think this code will solve my problem, I will try it. Thank you. – Darshak May 14 '13 at 07:27
  • do one thing. re-size your image to fit screen before applying to background. Mean create a sample size. – Chintan Rathod May 15 '13 at 07:50
  • I already done this, but I have to create tablet size also ... means layout-sw600dp and layout-sw800dp layouts. in layout-sw800dp it takes full resolution 800px* in that case it exceeds VM size. – Darshak May 15 '13 at 08:03
0

You must unload your texture atlases and reload them again if required, otherwise it is definitely going to generate out of memory error.
Here is how you can unload your texture to release memory:

    // all the textures you think are big      
    Engine.getTextureManager().unloadTexture(bg); 
    bg.clearTextureAtlasSources();    
    System.gc();

I hope it will help solving your problem.

ann
  • 576
  • 1
  • 10
  • 19
M.Mohsin
  • 314
  • 1
  • 3
  • 15
0

Two solution I like to mention first if you are using not much heavy images add android:largeHeap="true" in your AndroidManifest.xml.

or

load your bitmaps using Outofmemory solution link and recycle that bitmap while switching activities. Its common problem and its solution provide in stackoverflow multiple times.

It would probably the best if you went through the existing questions answers see if yours matches with some of existing ones, then if not, write up what makes your situation different.

Strange out of memory issue while loading an image to a Bitmap object

Out of memory exception due to large bitmap size

Android handling out of memory exception on image processing

Community
  • 1
  • 1
user1621629
  • 765
  • 7
  • 19
  • First I want to thanking you, but I am not use bitmap object. Just put the background to layout. – Darshak May 14 '13 at 09:03
  • But you can set Image to background of that layout using `ImageView.setImageBitmap(bitmap);` try it and let me know. – user1621629 May 14 '13 at 09:07
0

to keep heap size at minimum ;

when you return from 3rd page you can use code below which will clear activities.

Intent intent = new Intent(getActivity(), MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//to clear previous activities                      
startActivity(intent);

or you can use to clear activity.

finish(); 

or you can just pass context instead of creating new one

Activity a = (Activity) getContext();

or you can use fragments.

Alp
  • 1,863
  • 1
  • 20
  • 38