繁体   English   中英

Xamarin Android OutOfMemoryError视图分页器中的大图像

[英]Xamarin Android OutOfMemoryError large images in view pager

我有一个视图寻呼机,它具有ImageView作为背景。 资源图片为750x1205,我将其保留在drawable-xhdpi中。 我没有其他尺寸的图像。

当我在某个时候滚动寻呼机时,抛出OutOfMemoryError

mPagerBackground.SetImageResource(page.backgroundResId);

我将android:largeHeap="true"添加到AndroidManifest,还添加了((BitmapDrawable)mPagerBackground.Drawable).Bitmap.Recycle(); 就在我的适配器中的SetImageResource之前,但是没有一个解决了问题。

您对如何在不调整图像大小的情况下解决该问题有任何建议?

在此先感谢您的帮助!

错误:

Java.Lang.OutOfMemoryError: 
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3053/a94a03b5/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143
  at Android.Runtime.JNIEnv.CallVoidMethod (IntPtr jobject, IntPtr jmethod, Android.Runtime.JValue* parms) [0x00063] in /Users/builder/data/lanes/3053/a94a03b5/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:571
  at Android.Widget.ImageView.SetImageResource (Int32 resId) [0x0005a] in /Users/builder/data/lanes/3053/a94a03b5/source/monodroid/src/Mono.Android/platforms/android-23/src/generated/Android.Widget.ImageView.cs:1350
  at [...](Android.Views.ViewGroup container, Int32 position) [0x0012c] in[...] Android.Support.V4.View.PagerAdapter.n_InstantiateItem_Landroid_view_ViewGroup_I (IntPtr jnienv, IntPtr native__this, IntPtr native_container, Int32 position) [0x00011] in <filename unknown>:0
  at at (wrapper dynamic-method) System.Object:9d522553-ebab-4c12-bb3c-1791ac15f74a (intptr,intptr,intptr,int)
  at --- End of managed exception stack trace ---
  at java.lang.OutOfMemoryError
  at at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
  at at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
  at at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422)
  at at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840)
  at at android.content.res.Resources.loadDrawable(Resources.java:2110)
  at at android.content.res.Resources.getDrawable(Resources.java:700)
  at at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:323)
  at at android.support.v7.widget.TintManager.getDrawable(TintManager.java:175)
  at at android.support.v7.widget.TintManager.getDrawable(TintManager.java:168)
  at at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:51)
  at at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:72)
  at at md50e0099531e777fd8d5bed58953e4d813.EscapeLoungesPagerAdapter.n_instantiateItem(Native Method)
  at at md50e0099531e777fd8d5bed58953e4d813.EscapeLoungesPagerAdapter.instantiateItem(EscapeLoungesPagerAdapter.java:39)
  at at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:870)
  at at android.support.v4.view.ViewPager.populate(ViewPager.java:1086)
  at at android.support.v4.view.ViewPager.populate(ViewPager.java:952)
  at at android.support.v4.view.ViewPager$3.run(ViewPager.java:251)
  at at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:1849)
  at at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:1978)
  at at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1859)
  at at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
  at at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
  at at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
  at at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
  at at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
  at at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
  at at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
  at at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
  at at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
  at at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
  at at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
  at at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
  at at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
  at at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
  at at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
  at at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
  at at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
  at at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
  at at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
  at at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
  at at md50e0099531e777fd8d5bed58953e4d813.ResideMenu.n_dispatchTouchEvent(Native Method)
  at at md50e0099531e777fd8d5bed58953e4d813.ResideMenu.dispatchTouchEvent(ResideMenu.java:61)
  at at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
  at at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
  at at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
  at at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
  at at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
  at at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
  at at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
  at at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
  at at android.view.View.dispatchPointerEvent(View.java:7886)
  at at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3954)
  at at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3833)
  at at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
  at at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
  at at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
  at at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
  at at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
  at at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
  at at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
  at at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
  at at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
  at at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
  at at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
  at at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5602)
  at at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5582)
  at at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5553)
  at at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5682)
  at at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
  at at android.os.MessageQueue.nativePollOnce(Native Method)
  at at android.os.MessageQueue.next(MessageQueue.java:138)
  at at android.os.Looper.loop(Looper.java:123)
  at at android.app.ActivityThread.main(ActivityThread.java:5017)
  at at java.lang.reflect.Method.invokeNative(Native Method)
  at at java.lang.reflect.Method.invoke(Method.java:515)
  at at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
  at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
  at at dalvik.system.NativeStart.main(Native Method)

编辑:

正如SushiHangover所建议的那样,我尝试了以下代码,但它无助于解决问题。

View view = (View) objectValue;
            ImageView imageView = (ImageView)view.FindViewById (Resource.Id.image_id);
            Drawable drawable = imageView.Drawable;
            if (drawable is BitmapDrawable) {
                BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable;
                if (bitmapDrawable != null) {
                    Bitmap bitmap = bitmapDrawable.Bitmap;
                    if (bitmap != null && !bitmap.IsRecycled) {
                        bitmap.Recycle();
                    }
                }
            }

            container.RemoveView(view);

看起来很有希望的是使用Picasso,但是对于视图分页器,图像加载非常慢。

1)您使用的是C#:在图像上使用.Dispose而不是.Recycle,但首先将imageView中的image属性设置为NULL(在图像上调用Dispose之前)。

2)然后强制垃圾收集器:Gc.Collect()

使用完位图后,您需要对其进行清理。 您应该执行以下操作:

 public void Cleanup(Bitmap bitmap)
{
            if (bitmap == null)
                return;
            if (!bitmap.IsRecycled)
                bitmap.Recycle ();

            bitmap.Dispose ();
            bitmap = null;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM