Я использую Mono для Android (последняя версия на этом посту) с плагином Visual Studio для создания приложения для Android. Он нацелен на API Level 8, платформу Android 2.2.
Приложение отлично работает на Motorola Droid под управлением Android версии 2.2.2
Вылетает почти без вывода отладчика на Motorola Droid X2 под управлением Android 2.3.3
Единственный выход: Программа «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, и он работает нормально. Поэтому я уверен, что это связано с созданием динамического растрового изображения, но на данный момент я перепробовал все, что мог придумать.
UPDATE:
Я только что воспроизвел эту проблему в небольшом автономном проекте, доступном здесь: 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);
});
}
}
}