gpt4 book ai didi

c# - BitmapFactory.DecodeStream 上的 Android 单声道退出代码 255

转载 作者:太空宇宙 更新时间:2023-11-03 13:03:54 26 4
gpt4 key购买 nike

我正在使用 Mono for Android(本文发布时的最新版本)和 Visual Studio 插件来构建 Android 应用程序。它以 API 级别 8、Android 2.2 框架为目标。

该应用程序在运行 Android 版本 2.2.2 的摩托罗拉 Droid 上运行良好它在运行 Android 2.3.3 的摩托罗拉 Droid X2 上崩溃,调试器几乎没有输出

唯一的输出是:“Mono”程序已退出,代码为 255 (0xff)。

崩溃发生在以 using (Bitmap...

开头的行的此方法中
public static Drawable GetDrawable(string url) {
try {
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Bitmap bitmap = Android.Graphics.BitmapFactory.DecodeStream(response.GetResponseStream())) {
Drawable image = (Drawable)(new BitmapDrawable(bitmap));
return image;
}
}
catch {
return null;
}
}

如果我在该行设置断点,它会正确中断,但我找不到任何错误。如果我在该行之后设置断点,调试器将简单地分离并且应用程序强制退出。

我有一个类似的方法,它从 JSON 返回一个对象,并且工作正常。所以,我相当确定它与动态位图创建有关,但此时我已经尝试了所有我能想到的方法。

更新:

我刚刚在一个独立的小型项目中重现了这个问题:DrawableTest.zip

完整代码如下:

using System;
using System.Net;
using System.Threading;
using Android.App;
using Android.Widget;
using Android.OS;
using Android.Graphics;
using Android.Graphics.Drawables;

namespace DrawableTest {
[Activity(Label = "DrawableTest", MainLauncher = true, Icon = "@drawable/icon")]
public class Activity1 : Activity {

ImageView mImage;
Button mButton;
public const string mImageUrl = "http://i.stpost.com/erez4/erez?src=ProductImages/3576U_02.tif&tmp=MediumLargeG4&redirect=0&headers=proxy";

protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);

SetContentView(Resource.Layout.Main);

mImage = FindViewById<ImageView>(Resource.Id.MyImage);
mButton = FindViewById<Button>(Resource.Id.MyButton);

mButton.Click += new EventHandler(mButton_Click);
}

void mButton_Click(object sender, EventArgs e) {
ThreadPool.QueueUserWorkItem(o => AsyncImageLoad());
}

private Drawable GetDrawable(string url) {
try {
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Bitmap bitmap = Android.Graphics.BitmapFactory.DecodeStream(response.GetResponseStream())) {
Drawable image = new BitmapDrawable(bitmap);
return image;
}
}
catch (Exception e) {
return null;
}
}

private void AsyncImageLoad() {
Drawable image = GetDrawable(mImageUrl);

RunOnUiThread(() => {
mImage.SetImageDrawable(image);
});
}
}
}

最佳答案

这可能是我们流映射代码中的一个错误,类似于:http://bugzilla.xamarin.com/show_bug.cgi?id=1054

这应该会在下一个版本(1.9.x,可能)中修复。

作为解决方法,尝试复制 response.GetResponseStream()进入 System.IO.MemoryStream,然后将 MemoryStream 传递给 BitmapFactory.DecodeStream() .

更新

我的想法是正确的,但方法是错误的。而不是使用 BitmapFactory.DecodeStream() , 使用 BitmapFactory.DecodeByteArray() .以下代码适用于您的 DrawableTest.zip应用:

private Drawable GetDrawable(string url)
{
try {
HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(url);
using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
using (Stream responseStream = response.GetResponseStream()) {
MemoryStream workaround = new MemoryStream();
responseStream.CopyTo(workaround);

Bitmap bitmap = Android.Graphics.BitmapFactory.DecodeByteArray (
workaround.GetBuffer (), 0, (int) workaround.Length);
Drawable image = new BitmapDrawable(bitmap);
return image;
}
}
catch (Exception e) {
Log.Error("DrawableTest", "Exception: " + e.Message);
return null;
}
}

注意 using block 以确保资源得到处理。

关于c# - BitmapFactory.DecodeStream 上的 Android 单声道退出代码 255,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7535503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com