Xamarin.forms: [خطأ] System.NotSupportedException: تعذر تنشيط مثيل من النوع Xamarin.Forms.Platform.Android.FastRenderers.LabelRenderer

تم إنشاؤها على ٢٧ أكتوبر ٢٠١٩  ·  44تعليقات  ·  مصدر: xamarin/Xamarin.Forms

أفضل ممارسات تقرير الأخطاء: https://github.com/xamarin/Xamarin.Forms/wiki/Submitting-Issues

وصف

يحدث الاستثناء التالي عند التمرير في repro على جهاز Android.

**System.NotSupportedException:** 'Unable to activate instance of type Xamarin.Forms.Platform.Android.FastRenderers.LabelRenderer from native handle 0xbedad7ec (key_handle 0xd22eb7f).'

خطوات التكاثر

  1. الصق في MainPage.xaml.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace FastRendererCrash
{
    static class Extensions
    {
        public static View WithBounds(this View v, double x, double y, double w, double h)
        {
            AbsoluteLayout.SetLayoutBounds(v, new Rectangle(x, y, w, h));
            return v;
        }
    }
    // Learn more about making custom code visible in the Xamarin.Forms previewer
    // by visiting https://aka.ms/xamarinforms-previewer
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            IEnumerable<View> Select((string groupHeader, IEnumerable<int> items) t)
            {
                yield return new AbsoluteLayout
                {
                    Children = {
                        new Label {
                            Text = t.groupHeader, HorizontalTextAlignment = TextAlignment.Center,
                            TextColor = Color.FromUint(0xff5a5a5a), FontSize = 10
                        }.WithBounds(0, 21.1, 310, AbsoluteLayout.AutoSize) },
                    HorizontalOptions = LayoutOptions.FillAndExpand,
                    VerticalOptions = LayoutOptions.Start,
                    HeightRequest = 46
                };
                foreach (var item in t.items)
                {
                    yield return new AbsoluteLayout
                    {
                        Children = {
                            new Image { Source = ImageSource.FromResource("FastRendererScrollCrash.light.png", System.Reflection.Assembly.GetCallingAssembly()) }
                            .WithBounds(23.6, 14.5, 14.9, 20.7),
                            new Label { Text = item.ToString(), TextColor = Color.FromUint(0xff5a5a5a), FontSize = 10 }
                            .WithBounds(58, 18.2, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize)
                        },
                        HorizontalOptions = LayoutOptions.FillAndExpand,
                        VerticalOptions = LayoutOptions.Start,
                        HeightRequest = 49.7
                    };
                }
            }
            Content = new AbsoluteLayout
            {
                Children = {
                    new CollectionView {
                        ItemsSource =
                            new (string, Func<int, bool>)[] {
                                ("odd", i => i % 2 == 1),
                                ("even", i => i % 2 == 0),
                                ("triple", i => i % 3 == 0),
                                ("fives", i => i % 5 == 0) }
                            .Select(t => (t.Item1, Enumerable.Range(1, 100).Where(t.Item2)))
                            .SelectMany(Select),
                        ItemTemplate = new DataTemplate(() => {
                            var template = new ContentView();
                            template.SetBinding(ContentView.ContentProperty, ".");
                            return template;
                        }),
                        ItemsLayout = LinearItemsLayout.Vertical,
                        ItemSizingStrategy = ItemSizingStrategy.MeasureFirstItem
                    }
                }
            };
        }
    }
}
  1. أضف ملف صورة مضمّن باسم "light.png"
  2. تصحيح أخطاء التطبيق على هاتف Android (على سبيل المثال ، فإن هاتف Xiaomi Redmi 6 الذي يعمل بنظام Android 8.1 هو هاتف يمكنه إعادة معالجة الاستثناء)
  3. قم بالتمرير لأسفل بسرعة (استهدف 30 عنصرًا على الأقل لكل تحديث للشاشة)
  4. بعد تحديث شاشتين ، يتعطل التطبيق:
10-28 01:20:31.487 I/MonoDroid(17924): UNHANDLED EXCEPTION:
10-28 01:20:31.491 I/MonoDroid(17924): System.NotSupportedException: Unable to activate instance of type Xamarin.Forms.Platform.Android.FastRenderers.LabelRenderer from native handle 0xbedad7ec (key_handle 0xf313e4). ---> System.MissingMethodException: No constructor found for Xamarin.Forms.Platform.Android.FastRenderers.LabelRenderer::.ctor(System.IntPtr, Android.Runtime.JniHandleOwnership) ---> Java.Interop.JavaLocationException: Exception of type 'Java.Interop.JavaLocationException' was thrown.
10-28 01:20:31.491 I/MonoDroid(17924):    --- End of inner exception stack trace ---
10-28 01:20:31.491 I/MonoDroid(17924):   at Java.Interop.TypeManager.CreateProxy (System.Type type, System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x00055] in <11a340ccc8de43f09c97400139266ef5>:0 
10-28 01:20:31.491 I/MonoDroid(17924):   at Java.Interop.TypeManager.CreateInstance (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer, System.Type targetType) [0x00116] in <11a340ccc8de43f09c97400139266ef5>:0 
10-28 01:20:31.491 I/MonoDroid(17924):    --- End of inner exception stack trace ---
10-28 01:20:31.492 I/MonoDroid(17924):   at Java.Interop.TypeManager.CreateInstance (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer, System.Type targetType) [0x00182] in <11a340ccc8de43f09c97400139266ef5>:0 
10-28 01:20:31.492 I/MonoDroid(17924):   at Java.Lang.Object.GetObject (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer, System.Type type) [0x000c1] in <11a340ccc8de43f09c97400139266ef5>:0 
10-28 01:20:31.492 I/MonoDroid(17924):   at Java.Lang.Object._GetObject[T] (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x00017] in <11a340ccc8de43f09c97400139266ef5>:0 
10-28 01:20:31.492 I/MonoDroid(17924):   at Java.Lang.Object.GetObject[T] (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x00000] in <11a340ccc8de43f09c97400139266ef5>:0 
10-28 01:20:31.492 I/MonoDroid(17924):   at Java.Lang.Object.GetObject[T] (System.IntPtr jnienv, System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x00006] in <11a340ccc8de43f09c97400139266ef5>:0 
10-28 01:20:31.492 I/MonoDroid(17924):   at Android.Views.View.n_Invalidate (System.IntPtr jnienv, System.IntPtr native__this) [0x00000] in <11a340ccc8de43f09c97400139266ef5>:0 
10-28 01:20:31.492 I/MonoDroid(17924):   at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.55(intptr,intptr)

سلوك متوقع

التطبيق لا يتعطل ويستمر في التمرير.

السلوك الفعلي

تعطل التطبيق.

معلومات اساسية

  • الإصدار الذي يحتوي على الإصدار: 4.2، 4.3.0.908765
  • آخر نسخة جيدة معروفة: Idk
  • IDE: VS16.3.6
  • الأطر المستهدفة للمنصة:

    • أندرويد: 9.0

  • إصدار مكتبة دعم Android: 28.0.0.3
  • حزم Nuget: XForms4.3.0.908765 و XEssentials1.3.1 و NetStandard2.0.3 و AndroidSupport28.0.0.3
  • الأجهزة المتأثرة: هواتف Android بما في ذلك Xiaomi Redmi 6

لقطات

خلال الخطوة 4:

image |image
------ | ----------
image |image

رابط الاستنساخ


FastRendererCrash.zip

5 in-progress Android bug

التعليق الأكثر فائدة

لقد وجدت إصلاحًا مؤقتًا:

أضفت المُنشئ الثاني الذي عفا عليه الزمن إلى العارض المخصص. الآن بعد التمرير تم ضرب هذا المُنشئ ، ولا تظهر أية أخطاء.

[التجميع: ExportRenderer (typeof (Label) ، typeof (CustomLabelRenderer))]
مساحة الاسم MyApp.Droid.Renderers
{
فئة عامة CustomLabelRenderer: Xamarin.Forms.Platform.Android.FastRenderers.LabelRenderer
{
CustomLabelRenderer العام (سياق سياق): أساس (سياق)
{

    }

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

    }
}

}

ال 44 كومينتر

ذات صلة: # 2444 ، # 7663

لدي نفس المشكلة.
لدي عرض قائمة ، مع تسميات عليه. عندما أقوم ببعض التمرير لأعلى لأسفل ، أرى هذا التعطل ..
متى تخطط لاصلاحه؟

لقد وجدت إصلاحًا مؤقتًا:

أضفت المُنشئ الثاني الذي عفا عليه الزمن إلى العارض المخصص. الآن بعد التمرير تم ضرب هذا المُنشئ ، ولا تظهر أية أخطاء.

[التجميع: ExportRenderer (typeof (Label) ، typeof (CustomLabelRenderer))]
مساحة الاسم MyApp.Droid.Renderers
{
فئة عامة CustomLabelRenderer: Xamarin.Forms.Platform.Android.FastRenderers.LabelRenderer
{
CustomLabelRenderer العام (سياق سياق): أساس (سياق)
{

    }

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

    }
}

}

@ Happypig375 شكرا لحالة التكاثر الخاصة بك.
أعيد إنتاج المشكلة ، وأحاول تحديد السبب الجذري ، فهي ليست بسيطة لأنها مشكلة نتجت عن التفاعل مع جزء android الأصلي من الكود.
لدي بعض الأفكار لتحديد السبب ، لكن لا يمكنني تقديم تاريخ حل لك.
سأبلغ هنا لاحقًا إذا أحرزت بعض التقدم في هذا الشأن.

+1

في حالتي ، فشلت عندما أقوم بإجراء تعديلات على XAML مع تنشيط HotReload.

لقد تمكنت من العمل على هذا مؤخرًا.
لقد حددت السبب الجذري الذي يؤثر على تطبيق الاستنساخ.
لقد وجدت حلاً يبدو أنه يصلح المشكلة ولكني لست متأكدًا مما إذا كانت هي الطريقة الصحيحة لإصلاح المشكلة في الوقت الحالي.
أحتاج إلى مزيد من الوقت لتأكيد ذلك واختبار نهج آخر.

هنا نسخة nupkg لاختبار التعديل. يجب استبدال ملحق zip بـ nupkg (امتداد تحميل ملف حد جيثب).
Xamarin.Forms.4.3.99.zip

كنت بصدد اختبار الإصلاح الخاص بك ولكن للأسف يتأثر مشروعي بهذا https://github.com/reactiveui/Pharmacist/issues/77 الذي يمنعني من تجربته.

rbev لديك طريقتان لتثبيته.
استخدام موجز خاص مثل AzureDevOps Artifacts أو MyGet أو غير ذلك ...
أو يمكنك تثبيت الخلاصة من مسار محلي ، يمكن أن يكون مصدر nuget إما عنوان url http أو مسار دليل.

كان تثبيته من خلاصة محلية أمرًا جيدًا ، ولكن عملية البناء لدينا تتطلب تشغيل الصيدلي ولديه خطأ مفتوح في عدم دعم الخلاصات الخاصة.

kvpt اكتشفت طريقة لاختبار

على الرغم من أن حالتي لم تكن عبارة عن سيناريو نسخ متماثل بنسبة 100٪ ، فقد تمكنت سابقًا من تكرارها مرة واحدة على الأقل كل نصف دزينة أو نحو ذلك من عمليات الاختبار على عمليات إنشاء التصحيح.

أنتظر بفارغ الصبر الخاص بك

هل هناك أي حل بديل لهذا لا يتطلب استخدام أجهزة عرض قديمة؟ يمكنني الحفاظ على الإرث ولكن الأداء في جميع أنحاء تطبيقي أسوأ بشكل ملحوظ أثناء الانتظار.

يعمل العارض المخصص الذي تم نشره بواسطة @ school-today ، حتى لو كان قبيحًا.

@ PureWeen PR

samhouts - يتم إعادة إنتاجه أيضًا عند تغيير حجم التسمية ديناميكيًا. يرجى وضع أولوية عالية وإصلاح هذا في أسرع وقت ممكن.

+1. للأسف أيضا رؤية هذا

+1 على Xamarin.Forms 4.4.0.991265

تأكيد 4.4

EmilAlipiev (تعليق محذوف):

نجاح باهر شهرين بالفعل ولم يتخذ أي إجراء بشأن هذه القضية الحيوية.

الشكوى لا فائدة منها .. لقد جربت هذا في قضية حرجة أخرى مماثلة ولكن طريقة Xamarin في التعامل مع غضب العملاء هي تحديدهم على أنهم خارج الموضوع.

لا يزال يفشل - مخيب للآمال للغاية لأن الحلول لا تعمل.

kvpt هل تمكنت من إعادة إنتاج استثناء التخلص على الملصق؟

باستخدام الاستنساخ المرفق بهذه القضية
https://github.com/xamarin/Xamarin.Forms/issues/8262#issue -512996294

الاستثناء الذي أراه هو من ImageRenderer.
لقد أنشأت هذا العلاقات العامة الذي يبدو أنه يعمل على إصلاح سيناريو ImageRenderer
https://github.com/xamarin/Xamarin.Forms/pull/9034

PureWeen المسألة (مثل الآخرين تقريبًا المتعلقة بالتخلص) تتعلق بالتوقيت.
في حالة الاستنساخ ، على جهاز الكمبيوتر لدي 80٪ من الوقت تعطل من LabelRenderer و 20٪ من الوقت تعطل من DefaultRenderer (من التخطيط).
وفي كل مرة أرى في تتبع التكديس أن المشكلة يتم تشغيلها من خلال إبطال عرض تم تشغيله بواسطة رسم متحرك.
كل التفاصيل في وصف العلاقات العامة الخاصة بي.

لذلك أعتقد أن الإصلاح الوحيد في هذه الحالة هو تأخير التخلص بعد انتهاء الرسوم المتحركة.

ومع ذلك ، فإن إضافة المزيد من فحص التخلص قد يؤدي إلى إصلاح مشكلات أخرى متعلقة بالتخلص ، لذا فإن العلاقات العامة الخاصة بك مفيدة أيضًا.

kvpt طيب الآن أرى Labelrenderer واحد الآن.

كنت أحصل على ImageRenderer فقط ولكن الآن بعد أن قمت بحل ذلك ، ظهرت أداة LabelRenderer التي يتطلع العلاقات العامة الخاصة بك إلى إصلاحها.

kvpt ملاحظة مثيرة سألت فريق android عنها

إذا قمت فقط بإزالة هذا التجاوز
https://github.com/xamarin/Xamarin.Forms/blob/bd31e1e9fc8b2f9ad94cc99e0c7ab058174821f3/Xamarin.Forms.Platform.Android/Renderers/FormsTextView.cs#L29

الاستثناء يزول.

@ PureWeen لست متأكدًا مما إذا كان تجاوز طريقة الإبطال أو تخطي الإبطال هو الذي يتسبب في تأخيره لأن android يقوم بذلك لاحقًا على أي حال.

هناك بالفعل مشكلة تتعلق بتوقيت الإبطال والتي يبدو أنها تحدث في وقت ما بعد التخلص ، مع عرض المجموعة على الأقل.
لا تبدو المشكلة خاصة بنوع العارض ، على الرغم من أن عارض التسمية هو الأكثر تأثرًا بالمشكلة.

إذا قمت بإزالة التخطي ، فإن المشكلة تؤثر على عارض التخطيط ، ولكن من الصعب إعادة إنتاجه.

image
image

kvpt إذا قمت بإزالة جميع عمليات

مثل إذا كنت تستخدم الرمز الذي لدي في هذا PR؟

https://github.com/xamarin/Xamarin.Forms/pull/9034

PureWeen لقد أجريت بعض الاختبارات.
أثناء التحقيق الذي أجريته ، تجاوزت طريقة Invalidate الخاصة بـ VisualElementRenderer (للتحقق من التخلص). أزلته وذهب الخطأ مع DefaultRenderer.
حسنًا ، هناك شيء معطل في وقت التشغيل مع تجاوز هذه الطريقة.

kvpt hehe نعم ...

أثناء التحقيق الذي أجريته ، تجاوزت طريقة Invalidate الخاصة بـ VisualElementRenderer (للتحقق من التخلص). أزلته وذهب الخطأ مع DefaultRenderer.

هذا هو الأساس الذي حدث لي مع هذا السلوك. أضفت تجاوز يبطل داخل DefaultRenderer في محاولة لاتباع مسار إبطال والتي تحصل على استثناء هناك.

بمجرد أن أتمكن من الحصول على مزيد من التفاصيل من فريق XA حول ما يفكرون فيه ، سأعود إليك.

أعتقد أن العلاقات العامة الخاصة بي تعمل في الوقت الحالي. تمت إضافة SkipInvalidate منذ وقت طويل جدًا ولا أعتقد أنه يفعل ذلك كثيرًا بعد الآن

هل هي علاقة PR # 9034؟ أو آخر؟

نفس المشكلة +1

نفس المشكلة +1

أي تحديث ، حيث سيحصل إصدار XF على هذا الحل

مرحبًا ، لدينا الآن عدد غير قليل من الصفحات المعطلة في تطبيقنا منذ أن قمنا بالترقية إلى أحدث نماذج xamarin
هل سيكون هذا متاحًا في الإصدار القادم؟
شكر

تم دمج الإصلاح في 4.4 والذي سيتم إصداره قريبًا

مغلق بـ # 9034

samhouts الثابتة بالنسبة لنا في أحدث إصدار من X.Forms 4.4.0991537.
شكرا على ذلك.

samhouts XF 4.5 لديهم نفس المشكلة

System.NotSupportedException: "تعذر تنشيط مثيل من النوع Xamarin.Forms.Platform.Android.ImageButtonRenderer من المقبض الأصلي 0xfff4abbc (key_handle 0xa188909)."
XF 4.5.0.530

@ haiduong741 هل يمكنك توفير stacktrace الاستثناء الكامل.
يمكن أن يكون نفس السبب كما كان من قبل (Invalidate method) أو مشكلة أخرى بنفس النتيجة.

@ haiduong741 هل يمكنك توفير stacktrace الاستثناء الكامل.
يمكن أن يكون نفس السبب كما كان من قبل (Invalidate method) أو مشكلة أخرى بنفس النتيجة.

9880

المشكلة نفسها.

إذن ، هل هذا ثابت؟ أتلقى استثناء LabelRenderer.

تتبع المكدس:

  at Java.Interop.TypeManager.CreateInstance (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer, System.Type targetType) [0x00182] in <f0c385c91ba54fe48d1d4683597ba21a>:0 
  at Java.Lang.Object.GetObject (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer, System.Type type) [0x000c1] in <f0c385c91ba54fe48d1d4683597ba21a>:0 
  at Java.Lang.Object._GetObject[T] (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x00017] in <f0c385c91ba54fe48d1d4683597ba21a>:0 
  at Java.Lang.Object.GetObject[T] (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x00000] in <f0c385c91ba54fe48d1d4683597ba21a>:0 
  at Java.Lang.Object.GetObject[T] (System.IntPtr jnienv, System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x00006] in <f0c385c91ba54fe48d1d4683597ba21a>:0 
  at Android.Views.View.n_Invalidate (System.IntPtr jnienv, System.IntPtr native__this) [0x00000] in <f0c385c91ba54fe48d1d4683597ba21a>:0 
  at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.47(intptr,intptr)

إصدار My Xamarin.Forms: 4.4.0.991210-pre2.

إصدار My Xamarin.Forms: 4.4.0.991210-pre2.

لا ، يلزمك التحديث إلى الإصدار 4.4.0.991537

إصدار My Xamarin.Forms: 4.4.0.991210-pre2.

لا ، يلزمك التحديث إلى الإصدار 4.4.0.991537

نجح حل @ school-today في تنفيذ الحيلة ، على الرغم من وجود بعض القطع الأثرية. تمت ترقيته إلى 4.6.0 نفسه ، وتم إصلاحه. لدي سؤال: لماذا ترقيات XF غير متسقة فيما يتعلق بكل منصة. السبب في أننا لم نقم بالترقية إلى 4.6.0 أبدًا لأنه كسر أشياء معينة في iOS وبعضها في Android. ضع في اعتبارك أنها لم تكن قضايا مماثلة. لماذا ا؟ مثل ، في صور iOS لا يتم تحميلها وهناك ببساطة شاشة بيضاء فارغة بدلاً من ذلك وفي Android ، يفشل SSL.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات