我是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天而没有运气,任何帮助都会非常感激。
答案 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)