处理位图加载和处理可能

时间:2012-10-06 10:06:43

标签: exception memory xamarin.android

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

我有一个monodrid应用程序,可将图像上传到网络服务,图像来自设备相机或图片库。

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

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();
    }
}

第二个问题是,当用户确认从摄像机拍摄或从图库中选取的所选图像天气时,我创建了一个新的Bitmap进行压缩并发送到我使用以下代码托管的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服务方法。

这个代码在我第一次启动应用程序时会完美运行,但是当我尝试加载第二个图像时,我得到OutOfMemoryError异常并且没有加载图像。

我如何加载一个位图并处理它可能所以我可以避免这个异常? 请注意,此处的每一步都通过单独的活动进行管理:

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

据我所知,活动在完成后处理,所以默认情况下,其中使用的所有资源也将被处置,但在我的情况下,它似乎不是!。

我已经搜索了3天而没有运气,任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:2)

一般来说,位图在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)