Как исправить ошибку java.lang.OutOfMemoryError в Android

Я хочу разработать приложение для Android, и в этом приложении я использую множество методов. но когда-нибудь при работе с приложением показываю мне эту ошибку в LogCat:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: ir.mototel.mototel, PID: 4899
                  java.lang.OutOfMemoryError: Failed to allocate a 490012 byte allocation with 316664 free bytes and 309KB until OOM
                      at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                      at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
                      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
                      at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
                      at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1080)
                      at android.content.res.Resources.loadDrawableForCookie(Resources.java:2635)
                      at android.content.res.Resources.loadDrawable(Resources.java:2540)
                      at android.content.res.TypedArray.getDrawable(TypedArray.java:870)
                      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:60)
                      at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:56)
                      at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
                      at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1017)
                      at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1076)
                      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:746)
                      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
                      at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:838)
                      at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:838)
                      at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
                      at com.sepandar.xengine.singleVideo.view.DetailFragment.onCreateView(DetailFragment.java:182)
                      at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)
                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
                      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
                      at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1643)
                      at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679)
                      at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
                      at android.support.v4.view.ViewPager.populate(ViewPager.java:1272)
                      at android.support.v4.view.ViewPager.populate(ViewPager.java:1120)
                      at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1646)
                      at android.view.View.measure(View.java:18788)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                      at android.view.View.measure(View.java:18788)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
                      at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
                      at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
                      at android.view.View.measure(View.java:18788)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                      at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:703)
                      at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:770)
                      at android.view.View.measure(View.java:18788)
                    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.

i Напишите этот код в теге Application в Manifest android:largeHeap="true", но покажите мне эту ошибку еще раз!

Как я могу это исправить? Пожалуйста, помогите мне ‹3


person Dj.Soa    schedule 04.12.2016    source источник
comment
Попробуйте использовать ресурсы меньшего размера   -  person Mushirih    schedule 04.12.2016
comment
проблема с загрузкой изображений большего размера, возможно, вы можете попробовать с другим изображением с небольшим размером и лучше для производительности. Вы можете устранить ошибку, но нехватка памяти всегда влияет на производительность других потоков, может добавляться журнал в пользовательском интерфейсе.   -  person Swapnil    schedule 04.12.2016
comment
Вы показываете большое количество изображений?   -  person Mithun Sarker Shuvro    schedule 04.12.2016
comment
@shuvro, да мой друг   -  person Dj.Soa    schedule 04.12.2016
comment
@ Dj.Soa вы загружаете изображения из Интернета через какой-то api или только локальные изображения, которые вы поместили в свою папку для рисования?   -  person Mithun Sarker Shuvro    schedule 04.12.2016
comment
@shuvro, нет, я получаю изображения с сервера и показываю их в своем приложении. как я могу это исправить? пожалуйста, помогите мне   -  person Dj.Soa    schedule 04.12.2016
comment
@ Dj.Soa, пожалуйста, поделитесь своим кодом для показа изображений   -  person Mithun Sarker Shuvro    schedule 04.12.2016
comment
@shuvro, у меня большое приложение и большой код. где код хочешь?   -  person Dj.Soa    schedule 04.12.2016
comment
Код @ Dj.Soa для вашего imageView и отображения изображений   -  person Mithun Sarker Shuvro    schedule 04.12.2016
comment
Как вы думаете, мы могли бы помочь с такой проблемой? У вас огромное сложное приложение, и оно либо просто использует слишком много памяти, либо содержит одну (или несколько) ошибок, которые приводят к нехватке памяти. Нет ничего, что могли бы сделать для вас люди, не имеющие доступа к вашему исходному коду. Это ваше приложение; поэтому вы должны научиться выполнять профилирование памяти на Android, чтобы понять, что ваше приложение на самом деле делает. А затем, когда у вас возникнет конкретный вопрос, вы можете вернуться и задать его. Но пока вся необходимая информация на вашей стороне!   -  person GhostCat    schedule 04.12.2016
comment
@shuvro, я пишу этот код в классе ViewHolder: Glide.with(context).load(content.getThumbImage()).asBitmap().transform(new CenterCrop(context)).placeholder(R.drawable.placeholder).into(thumbnail);   -  person Dj.Soa    schedule 04.12.2016
comment
@shuvro, ты можешь мне помочь, друг мой?   -  person Dj.Soa    schedule 04.12.2016
comment
@ Dj.Soa проверьте мой ответ и позвольте мне, если он сработает   -  person Mithun Sarker Shuvro    schedule 04.12.2016
comment
Возможный дубликат OutOfMemoryError   -  person Yogesh Rathi    schedule 04.12.2016


Ответы (1)


Создайте папку с именем drawable-nodpi внутри вашей res папки. Поместите все изображения, которые вы хотите показать, включая placeholder изображения, в эту папку. После этого загрузите изображение, подобное этому

Glide.with(context)
   .load(content.getThumbImage())
   .asBitmap()‌​.transform(new CenterCrop(context))
   .diskCacheStrategy( DiskCacheStrategy.NONE )
   .skipMemoryCache( true )
   .placeholder(R.drawable.placeholder)
   .int‌​o(thumbnail)

Сообщите мне, работает ли это для вас

person Mithun Sarker Shuvro    schedule 04.12.2016
comment
Я не хочу сохранять эти изображения в телефоне (drawable-nodpi), я хочу просто загрузить с сервера и показать в imageview. не сохранять изображения. если я просто добавлю эти коды .diskCacheStrategy( DiskCacheStrategy.NONE ) .skipMemoryCache( true ) исправит мою проблему? что такое работа этих кодов? - person Dj.Soa; 04.12.2016
comment
@ Dj.Soa Я спросил вас в комментарии, что вы загружаете изображения из Интернета через какой-то api? Ты сказал нет. Кстати, тогда просто поместите свои изображения-заполнители в drawable-nodpi, я надеюсь, что это решит вашу проблему. - person Mithun Sarker Shuvro; 04.12.2016
comment
@Shuvaro, прости, мой друг, прости. Я просто должен это изображение с сервера, а не сохранять в телефоне. работает ли над этой проблемой над кодом? - person Dj.Soa; 04.12.2016
comment
Спасибо, мой друг, и последний вопрос. пожалуйста спросите это ‹3. почему я должен добавить эти коды .diskCacheStrategy( DiskCacheStrategy.NONE ) .skipMemoryCache( true )? при добавлении этих кодов не проблема для моего запроса с сервера? Спасибо - person Dj.Soa; 04.12.2016
comment
Поскольку вы загружаете огромное количество изображений и они кешируются в память устройства, когда предел памяти превышает, вы получаете эту ошибку, но если вы добавите это, изображения не просто кэшируются на вашем устройстве. Следовательно, ошибки нехватки памяти нет. Если это решит вашу проблему, примите этот ответ. - person Mithun Sarker Shuvro; 04.12.2016