1

I have an Activity with fragment inside. On some devices like Xiaomi application crashes and OutOfMemoryError thrown. There's stacktrace:

Fatal Exception: java.lang.OutOfMemoryError: Failed to allocate a 9437196 byte allocation with 5089232 free bytes and 4MB until OOM
   at dalvik.system.VMRuntime.newNonMovableArray(VMRuntime.java)
   at android.graphics.BitmapFactory.nativeDecodeAsset(BitmapFactory.java)
   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:613)
   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:446)
   at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1080)
   at android.content.res.Resources.createFromResourceStream(Resources.java:2937)
   at android.content.res.Resources.loadDrawableForCookie(Resources.java:2669)
   at android.content.res.Resources.loadDrawable(Resources.java:2569)
   at android.content.res.TypedArray.getDrawable(TypedArray.java:872)
   at android.widget.ImageView.<init>(ImageView.java:152)
   at android.widget.ImageView.<init>(ImageView.java:140)
   at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:57)
   at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:53)
   at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
   at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:963)
   at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1022)
   at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
   at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:189)
   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:750)
   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:708)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:839)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:802)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:842)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:802)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:842)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:802)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:842)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:802)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:519)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:427)
   at com.rcd.perfecto.ui.fragments.AuthFragment.onCreateView(AuthFragment.java:154)
   at android.support.v4.app.Fragment.performCreateView(Fragment.java:1988)
   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1268)
   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1250)
   at android.support.v4.app.FragmentManagerImpl.dispatchReallyStop(FragmentManager.java:2148)
   at android.support.v4.app.FragmentController.dispatchReallyStop(FragmentController.java:247)
   at android.support.v4.app.FragmentActivity.onReallyStop(FragmentActivity.java:804)
   at android.support.v4.app.FragmentActivity.doReallyStop(FragmentActivity.java:790)
   at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:367)
   at android.support.v7.app.AppCompatActivity.onDestroy(AppCompatActivity.java:181)
   at android.app.Activity.performDestroy(Activity.java:6474)
   at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1143)
   at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3823)
   at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3854)
   at android.app.ActivityThread.access$1500(ActivityThread.java:153)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:148)
   at android.app.ActivityThread.main(ActivityThread.java:5432)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:735)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)

The exception is thrown when called onCreateView method of AuthFragment. There's method:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_auth, container, false);
    ButterKnife.bind(this, view);

    return view;
}

Exception is thrown on line View view = inflater.inflate(R.layout.fragment_auth, container, false); What can I do to solve this problem?

Oleg Ryabtsev
  • 457
  • 2
  • 9
  • 24
  • 1
    Are you loading any large image in your `ImageView` in xml layout? – Rohit Arya Apr 22 '16 at 09:22
  • I have an ImageView in layout and I pass there one image with size about 70 KB and it's static – Oleg Ryabtsev Apr 22 '16 at 09:24
  • 1
    Try to load that dynamically in java using image loading libraries like Glide, picasso. – Rohit Arya Apr 22 '16 at 09:26
  • Possible duplicate of [Strange out of memory issue while loading an image to a Bitmap object](http://stackoverflow.com/questions/477572/strange-out-of-memory-issue-while-loading-an-image-to-a-bitmap-object) – Henry Apr 22 '16 at 09:27
  • 2
    You are trying to allocate about 9MB of memory. android:largeHeap may save you, but...if your image is 70kb it is really strange that you are trying to allocate 9MB. You can also try to change your drawable folder name from "drawable" to "drawable-nodpi". If your folder is "drawable", it is interpreted from runtime as "drawable-mdpi" which is not exactly what you want :) – Kamen Stoykov Apr 22 '16 at 09:39
  • 2
    Improving your apps memory usage should be first port of call. Ensuring excess objects aren't being allocated, recycling Bitmaps, discarding resources when no longer required etc. Too many developers lazily enable large heap just so they don't have to learn how to code efficiently. – Kane O'Riley Apr 22 '16 at 11:31

1 Answers1

3

You can use largeHeap in your Application. Just add to Manifest:

    <application
    ...
    android:largeHeap="true"
    ...
Leonid Veremchuk
  • 1,952
  • 15
  • 27