- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用非常简单的代码来显示存储为可绘制对象的图片库。所有图片的大小均小于 200kb,分辨率为 1024x576 像素。
我的代码在我测试的 4 台设备上运行良好,并且适用于我的大多数用户。但是其中一些不断出现著名的 vm 预算内存问题。
他是我的代码:
在我的 Activity 的 onCreate() 方法中:
// set Factory for Image Switcher
imageSwitcher = (ImageSwitcher) findViewById(R.id.ImageSwitcher);
imageSwitcher.setFactory(new MyImageSwitcherFactory());
工厂类:
private class MyImageSwitcherFactory implements ViewFactory {
public View makeView() {
ImageView imageView = new ImageView(Main.this);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
return imageView;
}
}
和显示图片的代码:
try {
// this is internal image loaded from drawables
imageSwitcher.setImageResource(images.get(imageNumber - 1).imageResourceID);
} catch (Exception e) {
// no image will be shown
}
某些手机(占下载的很小一部分)在 try/catch block 中发生错误,并且某些手机的 Activity 甚至根本无法启动。
我阅读了有关回收位图和内存泄漏问题的信息,但我的 Activity 在单顶模式下运行,并且不会在方向更改时重新创建,因此它始终是相同的 Activity 。我也不直接使用位图。
我能否以某种方式改进我的代码以消除此错误?
第一类错误:
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:464)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:340)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
at android.content.res.Resources.loadDrawable(Resources.java:1705)
at android.content.res.Resources.getDrawable(Resources.java:580)
at android.widget.ImageView.resolveUri(ImageView.java:548)
at android.widget.ImageView.setImageResource(ImageView.java:270)
at android.widget.ImageSwitcher.setImageResource(ImageSwitcher.java:41)
at com.mobilebabytoys.animalsoundsfree.Main.showNextImage(Main.java:356)
at com.mobilebabytoys.animalsoundsfree.Main.access$0(Main.java:284)
at com.mobilebabytoys.animalsoundsfree.Main$MyGestureDetector.onFling(Main.java:861)
at android.view.GestureDetector.onTouchEvent(GestureDetector.java:517)
at com.mobilebabytoys.animalsoundsfree.Main$8.onTouch(Main.java:218)
at android.view.View.dispatchTouchEvent(View.java:3705)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:874)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1695)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116)
at android.app.Activity.dispatchTouchEvent(Activity.java:2068)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1679)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1697)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4568)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
第二种错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mobilebabytoys.animalsoundsfree/com.mobilebabytoys.animalsoundsfree.Main}: android.view.InflateException: Binary XML file line #15: Error inflating class <unknown>
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3812)
at android.app.ActivityThread.access$2300(ActivityThread.java:126)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1936)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4595)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #15: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInflater.java:513)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
at android.app.Activity.setContentView(Activity.java:1629)
at com.mobilebabytoys.animalsoundsfree.Main.onCreate(Main.java:154)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
... 12 more
Caused by: java.lang.reflect.InvocationTargetException
at android.widget.ImageButton.<init>(ImageButton.java:78)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
at android.view.LayoutInflater.createView(LayoutInflater.java:500)
... 23 more
Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:464)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:340)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
at android.content.res.Resources.loadDrawable(Resources.java:1705)
at android.content.res.Resources.getDrawable(Resources.java:580)
at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:160)
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:788)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:729)
at android.content.res.Resources.loadDrawable(Resources.java:1690)
at android.content.res.TypedArray.getDrawable(TypedArray.java:548)
at android.widget.ImageView.<init>(ImageView.java:115)
at android.widget.ImageButton.<init>(ImageButton.java:82)
... 27 more
android.view.InflateException: Binary XML file line #15: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInflater.java:513)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
at android.app.Activity.setContentView(Activity.java:1629)
at com.mobilebabytoys.animalsoundsfree.Main.onCreate(Main.java:154)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3812)
at android.app.ActivityThread.access$2300(ActivityThread.java:126)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1936)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4595)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at android.widget.ImageButton.<init>(ImageButton.java:78)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
at android.view.LayoutInflater.createView(LayoutInflater.java:500)
... 23 more
Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:464)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:340)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
at android.content.res.Resources.loadDrawable(Resources.java:1705)
at android.content.res.Resources.getDrawable(Resources.java:580)
at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:160)
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:788)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:729)
at android.content.res.Resources.loadDrawable(Resources.java:1690)
at android.content.res.TypedArray.getDrawable(TypedArray.java:548)
at android.widget.ImageView.<init>(ImageView.java:115)
at android.widget.ImageButton.<init>(ImageButton.java:82)
... 27 more
java.lang.reflect.InvocationTargetException
at android.widget.ImageButton.<init>(ImageButton.java:78)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
at android.view.LayoutInflater.createView(LayoutInflater.java:500)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
at android.app.Activity.setContentView(Activity.java:1629)
at com.mobilebabytoys.animalsoundsfree.Main.onCreate(Main.java:154)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3812)
at android.app.ActivityThread.access$2300(ActivityThread.java:126)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1936)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4595)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:464)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:340)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
at android.content.res.Resources.loadDrawable(Resources.java:1705)
at android.content.res.Resources.getDrawable(Resources.java:580)
at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:160)
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:788)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:729)
at android.content.res.Resources.loadDrawable(Resources.java:1690)
at android.content.res.TypedArray.getDrawable(TypedArray.java:548)
at android.widget.ImageView.<init>(ImageView.java:115)
at android.widget.ImageButton.<init>(ImageButton.java:82)
... 27 more
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:464)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:340)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
at android.content.res.Resources.loadDrawable(Resources.java:1705)
at android.content.res.Resources.getDrawable(Resources.java:580)
at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:160)
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:788)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:729)
at android.content.res.Resources.loadDrawable(Resources.java:1690)
at android.content.res.TypedArray.getDrawable(TypedArray.java:548)
at android.widget.ImageView.<init>(ImageView.java:115)
at android.widget.ImageButton.<init>(ImageButton.java:82)
at android.widget.ImageButton.<init>(ImageButton.java:78)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
at android.view.LayoutInflater.createView(LayoutInflater.java:500)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
at android.app.Activity.setContentView(Activity.java:1629)
at com.mobilebabytoys.animalsoundsfree.Main.onCreate(Main.java:154)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3812)
at android.app.ActivityThread.access$2300(ActivityThread.java:126)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1936)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4595)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
我的 Activity 布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/MainLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:keepScreenOn="true">
<ImageSwitcher
android:keepScreenOn="true"
android:id="@+id/ImageSwitcher"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</ImageSwitcher>
</RelativeLayout>
最佳答案
关于位图错误:
在内存中创建它们之前,您应该考虑对位图进行降采样并调整它们的大小。看看以下线程 Handling Large Bitmaps
第二个错误是导致运行时无法从布局 XML 创建 View 层次结构。您是否在布局中使用自定义 View ?
编辑:您的布局 XML 看起来正确,现在您已经发布了整个转储,对我来说唯一的问题是位图的大小。我仍然认为你必须对图像进行降采样。
你的图片格式是什么; 1024 x 576 JPEG 图像在解压缩为 Bitmap
时可能太大。
关于android - imageSwitcher 和内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5176367/
我有一个 ImageSwitcher 和 2 个按钮...“下一个”和“上一个”用于滑动图像...但是它只在一侧从左向右滑动动画...如何解决这个问题?谢谢... Integer[] imageIDs
我正在使用 fade_in 和 fade_out 动画可用 android.R.anim.fade_in(fade_out)。基本上我可以改变动画的持续时间,但无论是 0.5 秒还是 2 秒动画仍然不
我在使用 imageswitcher 以适应屏幕时遇到问题。请检查图片 1。屏幕边缘仍有白色的可用空间。我想实现图2中的效果。没有空白和图像切换器非常适合屏幕。我可以使用 imageView 实现此效
在查看 Android (1.5) SDK 中的 ApiDemos 示例时,有一个使用 ImageSwitcher 的好示例,带有 Gallery 对象以提供“更改图像”操作。 我打算编写的应用程序,
我使用非常简单的代码来显示存储为可绘制对象的图片库。所有图片的大小均小于 200kb,分辨率为 1024x576 像素。 我的代码在我测试的 4 台设备上运行良好,并且适用于我的大多数用户。但是其中一
我正在尝试改进我的 Android 应用程序,我看到 ImageSwitcher 被大量引用用于各种动画任务,但谷歌文档完全是简陋的,除了其中的方法外没有描述任何内容类。同时例子中都使用了galler
我有图像切换器,每 x 秒更改一次图像。 如果我使用 setImageDrawable 将图像设置为切换器,它工作正常。但图像未对齐垂直中心。下面是我的布局
我正在尝试创建一个 ImageSwitcher 来浏览 DCIM 上的相机图像。当我翻阅图像时,出现 OutOfMemory 错误。如果为每个查看的相当大的图像分配内存,那么这是非常有意义的。我研究过
这是一个简单的应用程序,可以通过右/左糖果在图像之间切换 布局: onCreate中的定义: @Override protected void onCreate(Bun
我在 ImageSwitcher 中切换图像时遇到了一些 OutOfMemory 崩溃,这种情况很少见,但有时会发生(对我来说从来没有,否则我可以调试它哈哈)。 我只有 5 张图片 (PNG),每张图
我对 Android 开发非常陌生,我一直在尝试创建一个图片库应用程序。一切工作正常,除了当我滑动以显示下一个或上一个图像时,没有显示任何内容。我该如何解决这个问题? public class Pho
我在调整 primefaces imageSwitch 获取的图像大小时遇到问题。在随附的屏幕截图中,您可以看到我如何为 p:imageSwitch 提供了一个小尺寸的红色边框,但加载图像在外面。
我正在制作一个动画以在 ImageSwitcher 中显示许多图像,但我无法将图像设置为 ImageSwitcher。 这是我的 xml 中的图像切换器。 这是我的
我正在尝试在 android 中构建一个应用程序,在我的一项 Activity 中,我想显示全屏图像并通过在图片上滑动手指使它们左右滑动。 我已经尝试过基本的画廊 View 和图像切换器,但我无法处理
我正在做 ImageSwitcher,它工作完美,尝试将 ImageSwitcher 图像发送到另一个 Activity 。 ImageSwitcher 工作完美,但单击按钮转到下一个 Activit
谁能给我一个没有图库的 ImageSwitcher 的工作示例? 这是我的代码: ImageSwitcher mImageSwitcher; mImageSwitc
我正在尝试实现一个 ImageSwitcher 以移动到下一张图片。 单击“下一步”按钮时效果很好,但我无法让它与 fling GestureDetector 一起使用。 基本上,我在 onFling
我正在使用 Android 的鲜为人知的 ImageSwitcher为 ImageView 中的图像变化设置动画。目前,有 2 个图像(默认和“ok”图像)在某些事件(全部发生在主线程上)上打开 -
我想在 imageSwitcher 类上放置一个计时器。我能够使用以下代码为 2 张图片执行此操作,但我无法添加更多图片。谁能告诉我如何向 ImageSwitcher 计时器添加更多图片? image
我正在尝试在 ImageSwitcher 中显示来自 URL 的图像。我试过: myImageSwitcher.setImageURI(Uri.parse("http://miurl.com/imag
我是一名优秀的程序员,十分优秀!