gpt4 book ai didi

java - 清除内存中的图像流

转载 作者:太空宇宙 更新时间:2023-11-04 13:19:14 25 4
gpt4 key购买 nike

所以,我有一个非常简单的测试项目。一个计时器,每次偶数迭代都会生成一个 View ,而每次奇数迭代都会杀死该 View 。 View 本身是一个带有图像的RelativeLayout。我想做的是能够让这个时间无限期地运行,而不会出现内存问题。问题是,我不知道如何真正清除用于从内存中创建位图的图像流。当我不再需要位图时,我会回收它,但这还不够。代码采用 C# (Xamarin) 编写,但 java 答案也有帮助。

protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);

// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);

RelativeLayout mainView = new RelativeLayout (this);
this.AddContentView(mainView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent));

...

int i = 0;
System.Timers.Timer t = new System.Timers.Timer (100);
t.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e) {
RunOnUiThread(delegate() {
if(i++ % 2 == 0){
tmpView tView = new tmpView(this);
mainView.AddView(tView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent));
}else{
((tmpView)mainView.GetChildAt(0)).dispose();
mainView.RemoveAllViews();
}
});

};
t.AutoReset = true;
t.Start ();

}

private class tmpView:RelativeLayout{
ImageView img;
Android.Graphics.Bitmap bmp;
public tmpView(Context cntx):base(cntx){
SetBackgroundColor(new Android.Graphics.Color(200, 0, 0, 200));
System.IO.Stream imgStream = Application.Context.Assets.Open ("backgroundLeft.png");
img = new ImageView(cntx);
bmp = Android.Graphics.BitmapFactory.DecodeStream (imgStream);
img.SetImageBitmap(bmp);
//bmp.Recycle();
imgStream.Close();
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MatchParent, 500);
lp.TopMargin = 150;
this.AddView(img, lp);
}

public void dispose(){
bmp.Recycle ();
img.SetImageDrawable (null);
}
}

另外,我之所以说图像流是导致内存泄漏的原因,是因为我实际上能够让这个时间运行一整天。我必须在 imgStream.Close(); (GC.SuppressFinalize(imgStream);GC.Collect();)之后添加 GC 调用。但是调用 GC 会导致明显的延迟,而且,我不想删除所有内容,只是删除流。此外,它正在设备上运行。

泰,阿克塞尔

最佳答案

我建议您查看这篇有关 Android 内存的小讨论:

https://realm.io/news/droidcon-ricau-memory-leaks-leakcanary/

这非常有趣,并且应该解释为什么您的图像保留在垃圾收集器未清理的上下文中。

关于java - 清除内存中的图像流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33261121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com