-1

我正在开发一个ViewPager带有滑动图像的简单 android 应用程序。我有包含 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): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 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): 在 android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351) 05-24 21: 37:25.718: E/AndroidRuntime(551): 在 android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.content.res .Resources.loadDrawable(Resources.java:1935) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.content.res.Resources.getDrawable(Resources.java:664) 05-24 21:37 :25.718: E/AndroidRuntime(551): 在 android.widget.ImageView.resolveUri(ImageView.java:542) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.widget.ImageView.setImageResource(ImageView.java:315) 05-24 21:37:25.718: E/AndroidRuntime(551): 在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): 在 android.support.v4.view.ViewPager.populate(ViewPager.java:875) 05-24 21:37:25.718: E /AndroidRuntime(551): 在 android.support.v4.view.ViewPager.populate(ViewPager.java:772) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.support.v4.view。 ViewPager.completeScroll(ViewPager.java:1539) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.support.v4.view.ViewPager.computeScroll(ViewPager.java:1422) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.view.ViewGroup.drawChild(ViewGroup.java:2729) 05-24 21:37:25.718: E/AndroidRuntime(551) : 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.view.ViewGroup.drawChild(ViewGroup.java:2885) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.view.ViewGroup .drawChild(ViewGroup.java:2885) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) 05-24 21:37:25.718: E /AndroidRuntime(551): 在 android.view.View.draw(View.java:10981) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.widget.FrameLayout.draw(FrameLayout.java:450) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2126) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.view.ViewRootImpl.draw(ViewRootImpl.java:2026) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java :1634) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) 05-24 21:37:25.718: E/AndroidRuntime(551):在 android.os.Handler.dispatchMessage(Handler.java:99) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 android.os.Looper.loop(Looper.java:137) 05-24 21 :37:25.718: E/AndroidRuntime(551): 在 android.app.ActivityThread.main(ActivityThread.java:4424) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 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): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 05-24 21:37:25.718: E/AndroidRuntime(551): 在 com.android.internal。 os.ZygoteInit.main(ZygoteInit.java:551) 05-24 21:37:25.718: E/AndroidRuntime(551): at dalvik.system.NativeStart.main(Native Method)551)05-24 21:37:25.718:E/AndroidRuntime(551):在 dalvik.system.NativeStart.main(本机方法)551)05-24 21:37:25.718:E/AndroidRuntime(551):在 dalvik.system.NativeStart.main(本机方法)

4

3 回答 3

0

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

于 2013-05-24T19:24:48.567 回答
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

于 2013-09-25T12:57:50.127 回答
0

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

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

  2. 覆盖适配器方法 getItemPosition(如下所示)。当我们调用 mAdapter.notifyDataSetChanged(); ViewPager 询问适配器以确定在定位方面发生了什么变化。我们使用这种方法表示一切都发生了变化,因此重新处理所有视图定位。实际答案在这里:从 Android 中的 ViewPager 中删除片段页面

于 2013-05-24T19:49:00.227 回答