【问题标题】:How to fix java.lang.OutOfMemoryError in Android如何修复 Android 中的 java.lang.OutOfMemoryError
【发布时间】:2017-04-18 19:12:52
【问题描述】:

我想开发 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.

我在 Manifest android:largeHeap="true"Application 标记中编写此代码,但再次显示此错误!

我该如何解决?请帮帮我

【问题讨论】:

  • 尝试使用较小的资源
  • 加载较大尺寸图像的问题,您可以尝试使用其他尺寸较小且性能更好的图像。您可能会解决错误,但内存不足总是会影响其他线程性能可能会在用户界面中添加日志。
  • 您是否显示大量图像?
  • @shuvro,是的,我的朋友
  • @Dj.Soa 你是通过一些 api 从网上获取图片还是只是你放在可绘制文件夹中的本地图片?

标签: java android android-memory android-largeheap


【解决方案1】:

在您的 res 文件夹中创建一个名为 drawable-nodpi 的文件夹。将您想要显示的所有图像(包括placeholder 图像)放入该文件夹。之后像这样加载图像

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

让我知道这是否适合你

【讨论】:

  • 我不想将这些图像保存到手机中(drawable-nodpi),我只想从服务器加载并显示在imageview 中。不保存图像。如果我只是添加此代码.diskCacheStrategy( DiskCacheStrategy.NONE ) .skipMemoryCache( true ) 解决我的问题?这个代码是什么工作?
  • @Dj.Soa 我在评论中问你“你是通过一些 api 从网络获取图像”吗?你说不。顺便说一句,然后把你的占位符图片放到 drawable-nodpi 中,我希望它能解决你的问题
  • @Shuvaro,对不起我的朋友对不起。我只是应该从服务器中获取这些图像而不是保存到手机中。上面的代码是解决这个问题的吗?
  • 谢谢我的朋友,最后一个问题。请问这个 .diskCacheStrategy( DiskCacheStrategy.NONE ) .skipMemoryCache( true )?添加此代码时,我的服务器请求没有问题吗?谢谢
  • 当您加载大量图像并在内存限制超过时将其缓存到设备内存中,您会收到此错误,但如果添加此错误,图像不会简单地缓存在您的设备上。因此没有内存不足错误。如果它解决了您的问题,请接受此答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 2011-02-28
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2022-01-02
相关资源
最近更新 更多