Exception 处理位图加载和处理

Exception 处理位图加载和处理,exception,memory,xamarin.android,Exception,Memory,Xamarin.android,我是monodroid的新手,我这里有两个杀手我希望有人能帮我解决: 我有一个monodrid应用程序,可以将图像上传到web服务,图像来自设备摄像头或图片库 首先,我使用以下代码从设备摄像头拍摄照片: var intent = new Intent(MediaStore.ActionImageCapture); var availableActivities = this.PackageManager.QueryIntentActivities(intent, PackageInfoFlags

我是monodroid的新手,我这里有两个杀手我希望有人能帮我解决:

我有一个monodrid应用程序,可以将图像上传到web服务,图像来自设备摄像头或图片库

首先,我使用以下代码从设备摄像头拍摄照片:

var intent = new Intent(MediaStore.ActionImageCapture);
var availableActivities = this.PackageManager.QueryIntentActivities(intent, PackageInfoFlags.MatchDefaultOnly);

if (availableActivities != null && availableActivities.Count > 0)
{
    var dir = new Java.IO.File(
        Android.OS.Environment.GetExternalStoragePublicDirectory(
        Android.OS.Environment.DirectoryPictures), "myapp");

        if (!dir.Exists())
        {
            dir.Mkdirs();
        }

        _file = new Java.IO.File(dir, String.Format("image-{0}.jpg", Guid.NewGuid()));
        StaticDataHolder.ImageUri = Android.Net.Uri.FromFile(_file);

        intent.PutExtra(MediaStore.ExtraOutput, Android.Net.Uri.FromFile(_file));
        StartActivityForResult(intent, RESULT_CAMERA_CAPTURE);
}
此代码用于将缩放位图从StaticDataHolder.ImageUri读取到ImageView控件中,以便用户确认是否使用所选图像:

Bitmap largeBitmap = null;
try
{
    image.SetImageBitmap(null);
    if (Bitmap != null)
    {
        Bitmap.Recycle();
        Bitmap.Dispose();
    }
    largeBitmap = MediaStore.Images.Media.GetBitmap(ContentResolver, StaticDataHolder.ImageUri);
    Bitmap = GetScaledImage(largeBitmap);
    SetImageFromBitmap(image, Bitmap);
    return true;
}
catch (Java.Lang.OutOfMemoryError)
{                
    return false;
}
finally
{
    if (largeBitmap != null)
    {
        largeBitmap.Recycle();
        largeBitmap.Dispose();
    }
}
第二个问题是,当用户确认所选图像是从相机拍摄的还是从多媒体资料中拾取的时,我创建了一个新的位图进行压缩并发送到我使用以下代码托管的web服务:

byte[] buffer = null;

MemoryStream ms = null;
Bitmap bmp = null;

ms = new MemoryStream();
bmp = MediaStore.Images.Media.GetBitmap(ContentResolver, StaticDataHolder.ImageUri);

bmp.Compress(Bitmap.CompressFormat.Jpeg, 60, ms);
buffer = ms.GetBuffer();

ms.Dispose();
bmp.Recycle();
bmp.Dispose();
然后我将缓冲区传递给web服务方法

这段代码在我第一次启动应用程序时可以很好地工作,但是当我尝试加载第二个图像时,我会出现OfMemoryError异常,并且图像没有加载

如何加载位图并对其进行处理以避免此异常?。 请注意,此处的每个步骤都是通过单独的活动进行管理的:

1.拍摄或选择拍照活动。 2.确认所选照片活动。 3.加载所选照片并将其发送到web服务活动

据我所知,该活动在完成时将被释放,因此默认情况下,该活动中使用的所有资源也将被释放,但在我的情况下,它似乎不是


我已经搜索了3天,没有运气,任何帮助将不胜感激

位图在Android上通常是一个难题,因为它们生活在本机堆中,并且不直接进行垃圾收集,至少在Android中<2.3.x。您是否尝试过使用BitmapFactory

例如:

var opts = new BitmapFactory.Options() { InPurgeable = true, InInputShareable = true };
var bitmap = BitmapFactory.DecodeFile (pathToBitmap, opts);
将导致在需要时从内存中清除结果位图(http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html)