Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 清除内存中的图像流_Java_C#_Android_Memory Leaks_Garbage Collection - Fatal编程技术网

Java 清除内存中的图像流

Java 清除内存中的图像流,java,c#,android,memory-leaks,garbage-collection,Java,C#,Android,Memory Leaks,Garbage Collection,所以,我有一个非常简单的测试项目。一个计时器,每次偶数迭代生成一个视图,每次奇数迭代终止该视图。视图本身是一个与图像相对的视图。我想做的是能够让这段时间无限期地运行,而不会出现严重的内存问题。问题是,我不知道如何真正清除用于在内存中创建位图的图像流。当我不再需要位图时,我正在回收它,但这还不够。代码是用C#(Xamarin)编写的,但java答案也有帮助 protected override void OnCreate (Bundle bundle) { base.OnC

所以,我有一个非常简单的测试项目。一个计时器,每次偶数迭代生成一个视图,每次奇数迭代终止该视图。视图本身是一个与图像相对的视图。我想做的是能够让这段时间无限期地运行,而不会出现严重的内存问题。问题是,我不知道如何真正清除用于在内存中创建位图的图像流。当我不再需要位图时,我正在回收它,但这还不够。代码是用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调用
GC.SuppressFinalize(imgStream);
GC.Collect();
)。但是调用GC会导致明显的延迟,而且,我不想删除所有内容,只想删除流。而且,这是在设备上运行的

泰,
Axel

我建议您查看一下Android上关于内存的小讨论:


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

我建议您查看一下Android上关于内存的小讨论:

这很有趣,并且应该解释为什么您的图像保留在一个没有被垃圾收集器清理的上下文中