我正在开发一个简单的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(原生方法)
答案 0 :(得分:0)
您似乎正在使用设备无法处理的非常大的图像。尝试使用一些较小的尺寸
答案 1 :(得分:0)
ViewPager适配器一次加载所有图像,这就是您收到错误的原因。那么实际原因是什么: 1.您的图像尺寸非常大 2.您没有正确使用图像资源。尝试将不同大小的图像放在不同的文件夹中,如ldpi,hdpi,xdpi文件夹。 尝试使用上面的技巧。 如果仍然出现错误,可以按照以下步骤操作:
将FragmentPagerAdapter更改为FragmentStatePagerAdapter。这样做的原因是FragmentPagerAdapter会将它加载的所有视图永久保存到内存中。 FragmentStatePagerAdapter处理位于当前和可遍历视图之外的视图。
覆盖适配器方法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
获取