“System.ObjectDisposedException:无法访问计算机视觉xamarin应用程序的封闭流

问题描述 投票:-2回答:1
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)  
{  
        base.OnActivityResult(requestCode, resultCode, data);  

        if (requestCode == 0 && resultCode == Android.App.Result.Ok && data != null)  
        {  
            mBitMap = (Bitmap)data.Extras.Get("data");  
            imageView.SetImageBitmap(mBitMap);  
            byte[] bitmapData;  
            using (var stream = new MemoryStream())  
            {  
                mBitMap.Compress(Bitmap.CompressFormat.Jpeg, 100, stream);  
                bitmapData = stream.ToArray();  
            }  
            content = new ByteArrayContent(bitmapData);  
        }  
}  
c# xamarin.android
1个回答
0
投票

试图添加评论,但这太长了。我认为你有一些问题:

实际上,从根本上说,你的代码没有意义。看起来你试图通过Intent传递一个Bitmap,只是为了将它转换回一个字节数组。只需传递Intent中的字节数组。

即使忽略了上述内容,您还是会尝试这样做。

mBitMap = (Bitmap)data.Extras.Get("data");根本不应该工作。事实上,我很惊讶它不会在这里抛出运行时异常。你不能只是向一个Intent添加一个Bitmap,所以尽管Intent.Extras.Get返回一个对象,如果你只是尝试将它转换为Bitmap,它应该总是抛出一个异常。您也不能只将一个字节数组转换为Bitmap。如果要通过Intent传递位图,首先应将其转换为字节数组,然后将其添加到意图中。另一方面,从Intent获取字节数组并将其转换为Bitmap。

可以通过intent传递的数据量也有限制。 Google没有指定它可以容纳多少数据,因为它取决于许多因素(如堆大小),但假设它小于500kb。规则是,保持您传递的数据量很小。如果位图很小,就像一个图标,那么你就可以了,但如果它太大你会得到一个例外。

MemoryStream还将根据许多因素(包括分配的堆大小)来限制数据,因此,如果您处理大量数据,这很容易成为问题。如果您正在使用具有大型数据集的流,请使用自动实现缓冲的类或自行实现它。

最后,要注意无论如何都要传递Bitmaps。它们占用了大量内存,您必须非常小心,不要通过引用创建内存泄漏。在完成它们之后,请记住处理位图并删除对意图两侧的所有引用(或使用弱引用)。

如果Bitmap很大,是持久的,或者你有多个,你应该考虑将它写入文件系统然后检索它,尽管再次记得处理你拥有的任何位图并删除对它们的所有引用。

© www.soinside.com 2019 - 2024. All rights reserved.