我正在使用Xamarin和使用Picasso v2.5.2.1构建Android应用。 我最近创建了一个新的活动,但我注意到它会在一段时间后获得OOM。
我认为在创建最简单的版本之后我已经缩小了范围。一个将图像加载到一个小ImageView中的活动(初始活动比这更多),当您单击图像时,会创建一个显示图像的新全屏活动。
using Android.App;
using Android.Content;
using Android.OS;
using Android.Views;
using Android.Widget;
using Square.Picasso;
namespace PopDb_Android
{
[Activity()]
public class AdminItemImageActivity : Activity
{
protected override void OnCreate( Bundle savedInstanceState )
{
base.OnCreate( savedInstanceState );
Window.RequestFeature( WindowFeatures.NoTitle );
Window.AddFlags( WindowManagerFlags.Fullscreen );
SetContentView( Resource.Layout.AdminItemImage );
ImageView ivItem = FindViewById<ImageView>( Resource.Id.ivItem );
string imageUrl = Intent.Extras.GetString( "ImageUrl" );
Picasso.With( this )
.Load( imageUrl )
.Fit()
.CenterInside()
.MemoryPolicy( MemoryPolicy.NoCache, MemoryPolicy.NoStore )
.NetworkPolicy( NetworkPolicy.NoCache, NetworkPolicy.NoStore )
.Into( ivItem );
}
}
}
另一个Activity几乎相同 - 从URL加载图像并用Picasso显示,然后当你点击它时,它会加载上面的Activity。我在Picasso中禁用缓存只是为了确保这不是问题所在。
我见过的其他问题通常与加载太多图片或图片太大有关。然而在这个小例子中,我只加载一个小图像(~104KB jpg,300 * 400,内存时为0.45MB)。
我已经使用Android设备监视器监视堆,并注意到如果你多次进入/退出全屏视图,堆会上升很多,但即使在强制GC之后,它也没有&# 39;回去吧在转储堆并在Eclipse Memory Analyzer中查看它之后,我看到堆上最大的对象是ImageViews,数字等于我进出全屏的次数。因此,应用程序似乎因某些原因而持有这些ImageView的引用。
如果我继续进入/退出全屏活动,最终图像将停止显示,然后它会在某处与OOM崩溃。
我现在不知道该去哪了。我只是在做一些愚蠢的事情,还是可能是别的什么?
谢谢。