Xamarin. Android приложение вылетает с NotSupportedException - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть проект Xamarin. Android, который аварийно завершает работу при повторном отображении страницы со следующим сообщением об ошибке:

**System.NotSupportedException:** 'Unable to activate instance of type Xamarin.Forms.Platform.Android.ImageButtonRenderer from native handle 0x7fe2d1b234 (key_handle 0x3fea9eb).'

04-14 10:34:05.676 E/mono    ( 9225): 
04-14 10:34:05.676 E/mono    ( 9225): Unhandled Exception:
04-14 10:34:05.676 E/mono    ( 9225): System.NotSupportedException: Unable to activate instance of type Xamarin.Forms.Platform.Android.ImageButtonRenderer from native handle 0x7fe2d1b234 (key_handle 0x3fea9eb). ---> System.MissingMethodException: No constructor found for Xamarin.Forms.Platform.Android.ImageButtonRenderer::.ctor(System.IntPtr, Android.Runtime.JniHandleOwnership) ---> Java.Interop.JavaLocationException: Exception of type 'Java.Interop.JavaLocationException' was thrown.

Странно то, что страница загружается идеально с первого раза что вы получаете к нему доступ. Только когда вы уходите со страницы и затем возвращаетесь на страницу, где происходит сбой с этой ошибкой.

У меня есть модель представления, которая связывается с Syncfusion SfListView. Одним из этих элементов внутри этого списка является изображение. Вот код компоновки, который я считаю уместным:

<Grid HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <syncfusion2:SfPullToRefresh.PullableContent>
        <syncfusion:SfListView AutoFitMode="DynamicHeight">
            <syncfusion:SfListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <AbsoluteLayout x:Name="ViewLayout">
                            <Image 
                                Source="{Binding CameraSnapshot}" 
                                Aspect="AspectFill" 
                                WidthRequest="300" 
                                HeightRequest="200"
                                Visual="CustomImageVisual"
                                AbsoluteLayout.LayoutBounds="1,1,1,1" 
                                AbsoluteLayout.LayoutFlags="All" />
                        </AbsoluteLayout>
                    </ViewCell>
                </DataTemplate>
            </syncfusion:SfListView.ItemTemplate>
        </syncfusion:SfListView>
    </syncfusion2:SfPullToRefresh>
</Grid>

После того, как я вытащил список камер, я установил ItemSource моего списка просмотра в список моделей моих камер, а затем я вызвал метод в каждом элементе просмотра для запуска извлечения снимка с каждой камеры:

foreach (CameraViewModel camera in Cameras)
{
    camera.StartStatusThread();
}

Затем внутри моего объекта CameraViewModel (который привязан к представлению списка):

public async void StartStatusThread()
{
    ImageSource source = await CameraCommands.GetSnapshot(this);
    if (source != null)
    {
        CameraSnapshot = source;
    }
    else
    {
        CameraSnapshot = "nocamera.png";
    }
}

public ImageSource CameraSnapshot
{
    get
    {
        return snapshot;
    }
    set
    {
        snapshot = value;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("CameraSnapshot"));
    }
}

Функция CameraCommands.GetSnapshot(...) использует конфигурацию камеры и использует некоторые библиотеки Rtsp для возврата массива байт [] снимка с камеры и устанавливает источник, используя source = ImageSource.FromStream(() => new MemoryStream(bytes));

Если сделать это еще более странным, фактическая ошибка будет показана ниже (это находится внутри GetSnapshot (...)

byte[] bytes = null;
using (WebClient client = new WebClient())
{
   try
   {
      if (basicAuth != null)
      {
         client.Headers.Add("Authorization", basicAuth);
      }

      // error is thrown here...
      bytes = client.DownloadData(new Uri(link));
   }
   catch { }
   finally
   {
      client.Dispose();
   }
}
source = ImageSource.FromStream(() => new MemoryStream(bytes));

Что вызов вызова rest для получения данных имеет отношение к визуализации изображения ???

Опять же, все это работает отлично, как и ожидалось. в первый раз, когда я go перехожу на эту страницу, но во второй раз, когда я go перехожу на эту страницу, выдается ошибка. Поэтому что-то нельзя утилизировать должным образом, но я не могу придумать, что это может быть.

Я открыт для любых предложений, которые кто-либо должен решить.

Спасибо!

** обновлено ** Я попытался добавить пользовательский ImageRenderer, как было предложено:

[assembly: ExportRenderer(typeof(Image), typeof(Voltsec.Droid.Renderers.CustomImageRenderer), new[] { typeof(CustomImageVisual) })]
namespace Voltsec.Droid.Renderers
{
    public class CustomImageRenderer : Xamarin.Forms.Platform.Android.FastRenderers.ImageRenderer
    {
        public CustomImageRenderer(Context context) : base(context)
        { }

        [Obsolete]
        public CustomImageRenderer(IntPtr handle, JniHandleOwnership transfer)
        { }
    }
}

Он сразу выбрасывает эту ошибку, как только я go на эту страницу:

System.MissingMethodException: 'Constructor on type 'Voltsec.Droid.Renderers.CustomImageRenderer' not found.'

...