У меня есть проект 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.'