Intereting Posts
Android: добавьте просмотр с анимацией расширения (без мигания) Как интегрировать шаги Samsung Gear в приложение Android? Перезапуск приложения на Android-тесте Какова логика проектирования для фрагментов как статических внутренних классов и автономных публичных классов? Добавление карты Skobbler в мое пустое приложение Как заставить AccountManager (authtoken) и OpenID работать вместе (без AppEngine)? Как проверить подключение к Интернету в приложении Android terminal – telnet отсутствует команды, получая эту ошибку: KO: неизвестная команда, попробуйте 'help' Как обрабатывать исключения MonoDroid во всех случаях и предотвращать крах приложения Использование результата учетной записи andMan AccountManager.getAuthToken через Zend_Gdata (401 несанкционированного доступа) Что может быть причиной «длительного конфликта конкуренции с владельцем»? Как получить данные от объекта Json? Как отобразить диалог прогресса перед началом активности в Android? Параметр Android withText не работает для кнопок панели действий на Huawei MediaPad (T1-A21L) Share with android.support.v7 не показывает значки приложений

Исключения при использовании MvxAdapter

У меня есть следующая настройка: приложение с двумя вкладками. На второй вкладке ListView привязан к ObservableCollection. На первой вкладке есть элементы управления, которые заставляют ViewModel для второй вкладки перезагружать ObservableCollection. Он работал хорошо, пока я не добавил пользовательский MvxAdapter (это нужно для полиморфных элементов списка). После этого после каждого обновления я вижу следующие исключения в выводе приложения (обратите внимание, что список все еще перезагружает свои значения):

mvx:Warning: 42.24 Exception masked during Adapter RealNotifyDataSetChanged ArgumentException: 'jobject' must not be IntPtr.Zero. Parameter name: jobject at Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (IntPtr jobject, IntPtr jclass, IntPtr jmethod) [0x00010] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.14-series/8e79d361/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:866 at Android.Widget.BaseAdapter.NotifyDataSetChanged () [0x00058] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.14-series/8e79d361/source/monodroid/src/Mono.Android/platforms/android-19/src/generated/Android.Widget.BaseAdapter.cs:311 at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapter.RealNotifyDataSetChanged () [0x00000] in <filename unknown>:0 mvx:Warning: 42.24 Exception masked during Adapter RealNotifyDataSetChanged ArgumentException: 'jobject' must not be IntPtr.Zero. Parameter name: jobject at Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (IntPtr jobject, IntPtr jclass, IntPtr jmethod) [0x00010] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.14-series/8e79d361/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:866 at Android.Widget.BaseAdapter.NotifyDataSetChanged () [0x00058] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.14-series/8e79d361/source/monodroid/src/Mono.Android/platforms/android-19/src/generated/Android.Widget.BaseAdapter.cs:311 at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapter.RealNotifyDataSetChanged () [0x00000] in <filename unknown>:0 

Интересно, может ли кто-нибудь помочь мне найти причину, по которой эти исключения брошены.

 public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { base.OnCreateView(inflater, container, savedInstanceState); var view = this.BindingInflate(Resource.Layout.ChildPage_History, null); listView = view.FindViewById<MvxListView> (Resource.Id.history_list); listView.Adapter = new CustomAdapter (this.Activity, (IMvxAndroidBindingContext)BindingContext); return view; } 

Я думаю, проблема вызвана тем, что конструктор MvxListView создает MvxAdapter умолчанию. Когда привязки создаются, MvxAdapter по умолчанию подписывается на событие с изменением коллекции для коллекции, к которой привязан список. Однако, когда MvxListView.Adapter затем устанавливается в CustomAdapter , оригинальный MvxAdapter по-прежнему подписывается на коллекцию. В конечном итоге исходный MvxAdapter получает сбор мусора, поэтому, когда коллекция изменяет обработчик, вызывается с расположенным объектом, и указанное исключение является результатом.

Я решил проблему в своем проекте, получив свой собственный MvxListView который переопределяет конструктор и возвращает адаптер, то есть нет необходимости устанавливать его в OnCreateView:

 public class MyListView : MvxListView { public MyListView(Context context, IAttributeSet attrs) : base(context, attrs, new CustomAdapter(context)) { } } 

Просто измените формат XML, чтобы использовать этот класс вместо MvxListView и исключения должны прекратиться.

Это проблема с потоками. Вы должны поднять изменение свойства источника в правильном потоке. Попробуйте загрузить исходный код в другой проект, а затем верните его обратно в свойство, указанное в списке.