Android滑动图片应用中的内存不足错误

时间:2013-05-24 19:17:53

标签: android android-viewpager swipe

我正在开发一个简单的Android应用程序,其中ViewPager具有滑动图像。我有静态应用程序包含12个图像。当我滑动时,应用程序在第四张图像后崩溃。

如何理解堆栈跟踪并解决此问题?

e.. 05-24 21:37:25.718: E/AndroidRuntime(551): FATAL EXCEPTION: main 05-24 21:37:25.718: E/AndroidRuntime(551):
     

java.lang.OutOfMemoryError 05-24 21:37:25.718:E / AndroidRuntime(551):     在android.graphics.BitmapFactory.nativeDecodeAsset(本机方法)   05-24 21:37:25.718:E / AndroidRuntime(551):at   android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:483)   05-24 21:37:25.718:E / AndroidRuntime(551):at   android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)   05-24 21:37:25.718:E / AndroidRuntime(551):at   android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)   05-24 21:37:25.718:E / AndroidRuntime(551):at   android.content.res.Resources.loadDrawable(Resources.java:1935)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.content.res.Resources.getDrawable(Resources.java:664)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.widget.ImageView.resolveUri(ImageView.java:542)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.widget.ImageView.setImageResource(ImageView.java:315)05-24   21:37:25.718:E / AndroidRuntime(551):at   com.sqisland.android.swipe_image_viewer.MainActivity $ ImagePagerAdapter.instantiateItem(MainActivity.java:72)   05-24 21:37:25.718:E / AndroidRuntime(551):at   android.support.v4.view.ViewPager.addNewItem(ViewPager.java:692)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.support.v4.view.ViewPager.populate(ViewPager.java:875)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.support.v4.view.ViewPager.populate(ViewPager.java:772)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.support.v4.view.ViewPager.completeScroll(ViewPager.java:1539)   05-24 21:37:25.718:E / AndroidRuntime(551):at   android.support.v4.view.ViewPager.computeScroll(ViewPager.java:1422)   05-24 21:37:25.718:E / AndroidRuntime(551):at   android.view.ViewGroup.drawChild(ViewGroup.java:2729)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.view.ViewGroup.drawChild(ViewGroup.java:2885)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.view.ViewGroup.drawChild(ViewGroup.java:2885)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.view.View.draw(View.java:10981)05-24 21:37:25.718:   E / AndroidRuntime(551):at   android.widget.FrameLayout.draw(FrameLayout.java:450)05-24   21:37:25.718:E / AndroidRuntime(551):at   com.android.internal.policy.impl.PhoneWindow $ DecorView.draw(PhoneWindow.java:2126)   05-24 21:37:25.718:E / AndroidRuntime(551):at   android.view.ViewRootImpl.draw(ViewRootImpl.java:2026)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634)   05-24 21:37:25.718:E / AndroidRuntime(551):at   android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.os.Handler.dispatchMessage(Handler.java:99)05-24   21:37:25.718:E / AndroidRuntime(551):at   android.os.Looper.loop(Looper.java:137)05-24 21:37:25.718:   E / AndroidRuntime(551):at   android.app.ActivityThread.main(ActivityThread.java:4424)05-24   21:37:25.718:E / AndroidRuntime(551):at   java.lang.reflect.Method.invokeNative(Native Method)05-24   21:37:25.718:E / AndroidRuntime(551):at   java.lang.reflect.Method.invoke(Method.java:511)05-24 21:37:25.718:   E / AndroidRuntime(551):at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)   05-24 21:37:25.718:E / AndroidRuntime(551):at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)05-24   21:37:25.718:E / AndroidRuntime(551):at   dalvik.system.NativeStart.main(原生方法)

3 个答案:

答案 0 :(得分:0)

您似乎正在使用设备无法处理的非常大的图像。尝试使用一些较小的尺寸

答案 1 :(得分:0)

ViewPager适配器一次加载所有图像,这就是您收到错误的原因。那么实际原因是什么: 1.您的图像尺寸非常大 2.您没有正确使用图像资源。尝试将不同大小的图像放在不同的文件夹中,如ldpi,hdpi,xdpi文件夹。 尝试使用上面的技巧。 如果仍然出现错误,可以按照以下步骤操作:

  1. 将FragmentPagerAdapter更改为FragmentStatePagerAdapter。这样做的原因是FragmentPagerAdapter会将它加载的所有视图永久保存到内存中。 FragmentStatePagerAdapter处理位于当前和可遍历视图之外的视图。

  2. 覆盖适配器方法getItemPosition(如下所示)。当我们调用mAdapter.notifyDataSetChanged(); ViewPager询问适配器以确定在定位方面发生了哪些变化。我们使用此方法表示所有内容都已更改,因此重新处理所有视图定位。 实际答案如下:Remove Fragment Page from ViewPager in Android

答案 2 :(得分:0)

我确实将FragmentPagerAdapter更改为FragmentStatePagerAdapter。然而,滑动动作相当缓慢。好像它暂时解决了这个问题。

/**
 * The {@link android.support.v4.view.PagerAdapter} that will provide
 * fragments for each of the sections. We use a
 * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
 * will keep every loaded fragment in memory. If this becomes too memory
 * intensive, it may be best to switch to a
 * {@link android.support.v4.app.FragmentStatePagerAdapter}.
 */

详细教程可在此处http://blog.kerul.net/2013/09/adding-xml-layout-in-swipe-views.html

获取
相关问题