Код выхода Mono для Android 255 на BitmapFactory.DecodeStream - PullRequest
3 голосов
/ 24 сентября 2011

Я использую 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);
            });
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 29 сентября 2011

Это, вероятно, ошибка в нашем коде отображения потока, похожая на: http://bugzilla.xamarin.com/show_bug.cgi?id=1054

Это должно быть исправлено в следующем выпуске (1.9.x, вероятно).

КакОбходной путь, попробуйте скопировать response.GetResponseStream() в System.IO.MemoryStream, а затем передать MemoryStream в BitmapFactory.DecodeStream().

Update

У меня была правильная идея, но неправильный подход.Вместо использования 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, чтобы обеспечить размещение ресурсов.

1 голос
/ 24 сентября 2011

Попробуйте запустить без отладчика (Ctrl-F5), а затем проверьте журнал отладки Android на наличие исключения:

http://android.xamarin.com/Documentation/Guides/Android_Debug_Log

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...