簡體   English   中英

Xamarin 表單 android 9 崩潰

[英]Xamarin forms android 9 crash

我開發了一個 Xamarin Forms 應用程序,它在 Android 8 上運行良好。但是當我在 Android 9 上運行它時我會崩潰。崩潰似乎發生在從一個頁面轉換到另一個頁面或顯示等待彈出窗口時。 任何人都可以幫助確定這些僅在 Android 9 中發生的崩潰的原因。以下是調試中的輸出:

java.lang.IllegalArgumentException: Cannot set 'scaleX' to Float.NaN
android.view.View.sanitizeFloatPropertyValue()View.java:15549
android.view.View.sanitizeFloatPropertyValue()View.java:15523

android.view.View.setScaleX()View.java:14912
mono.android.animation.ValueAnimator_AnimatorUpdateListenerImplementor.n_onAnimationUpdate(Native Method)
mono.android.animation.ValueAnimator_AnimatorUpdateLis

tenerImplementor.onAnimationUpdate()ValueAnimator_AnimatorUpdateListenerImplementor.java:30
android.animation.ValueAnimator.animateValue()ValueAnimator.java:1547
android.animation.ValueAnimator.animateBasedOnTime()ValueAnimator.java:1339
android.animation.ValueAnimator.doAnimationFrame()ValueAnimator.java:1471
android.animation.AnimationHandler.doAnimationFrame()AnimationHandler.java:146
android.animation.AnimationHandler.access$100()AnimationHandler.java:37
android.animation.AnimationHandler$1.doFrame()AnimationHandler.java:54
android.view.Choreographer$CallbackRecord.run()Choreographer.java:1170
android.view.Choreographer.doCallbacks()Choreographer.java:984
android.view.Choreographer.doFrame()Choreographer.java:806
android.view.Choreographer$FrameDisplayEventReceiver.run()Choreographer.java:1158
android.os.Handler.handleCallback()Handler.java:873
android.os.Handler.dispatchMessage()Handler.java:99
android.os.Looper.loop()Looper.java:193
android.app.ActivityThread.main()ActivityThread.java:6863
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run()RuntimeInit.java:537
com.android.internal.os.ZygoteInit.main()ZygoteInit.java:858
Xamarin caused by: Java.Lang.IllegalArgumentException: Cannot set 'scaleX' to Float.NaN
Java.Interop.JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod(JniObjectReference instance, JniObjectReference type, JniMethodInfo method, JniArgumentValue* args)<8acc8089c2ed40d08469fbaa6710a44c>:0
Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeVirtualVoidMethod(string encodedMember, IJavaPeerable self, JniArgumentValue* parameters)<8acc8089c2ed40d08469fbaa6710a44c>:0
Android.Views.View.set_ScaleX(float value)Android.Views.View.cs:8908
Xamarin.Forms.Platform.Android.VisualElementTracker.UpdateScale()
Xamarin.Forms.Platform.Android.VisualElementTracker.HandlePropertyChanged(object sender, PropertyChangedEventArgs e)
Xamarin.Forms.Platform.Android.VisualElementTracker.HandleRedrawNeeded(object sender, EventArg<T> e)
Xamarin.Forms.VisualElement.BatchCommit()
Xamarin.Forms.AnimationExtensions.HandleTweenerUpdated(object o, EventArgs args)
Xamarin.Forms.Tweener.<Start>b__22_0(long step)
Xamarin.Forms.Internals.Ticker.SendSignals(int timestep)
Xamarin.Forms.Platform.Android.AndroidTicker.OnValOnUpdate(object sender, ValueAnimator.AnimatorUpdateEventArgs e)
Android.Animation.ValueAnimator.IAnimatorUpdateListenerImplementor.OnAnimationUpdate(ValueAnimator animation)Android.Animation.ValueAnimator.cs:147
Android.Animation.ValueAnimator.IAnimatorUpdateListenerInvoker.n_OnAnimationUpdate_Landroid_animation_ValueAnimator_(IntPtr jnienv, IntPtr native__this, IntPtr native_animation)Android.Animation.ValueAnimator.cs:95
at (wrapper dynamic-method) System.Object.19(intptr,intptr,intptr)
--- End of managed Java.Lang.IllegalArgumentException stack trace ---
java.lang.IllegalArgumentException: Cannot set 'scaleX' to Float.NaN
android.view.View.sanitizeFloatPropertyValue()View.java:15549
android.view.View.sanitizeFloatPropertyValue()View.java:15523
android.view.View.setScaleX()View.java:14912
mono.android.animation.ValueAnimator_AnimatorUpdateListenerImplementor.n_onAnimationUpdate(Native Method)
mono.android.animation.ValueAnimator_AnimatorUpdateListenerImplementor.onAnimationUpdate()ValueAnimator_AnimatorUpdateListenerImplementor.java:30
android.animation.ValueAnimator.animateValue()ValueAnimator.java:1547
android.animation.ValueAnimator.animateBasedOnTime()ValueAnimator.java:1339
android.animation.ValueAnimator.doAnimationFrame()ValueAnimator.java:1471
android.animation.AnimationHandler.doAnimationFrame()AnimationHandler.java:146
android.animation.AnimationHandler.access$100()AnimationHandler.java:37
android.animation.AnimationHandler$1.doFrame()AnimationHandler.java:54
android.view.Choreographer$CallbackRecord.run()Choreographer.java:1170
android.view.Choreographer.doCallbacks()Choreographer.java:984
android.view.Choreographer.doFrame()Choreographer.java:806
android.view.Choreographer$FrameDisplayEventReceiver.run()Choreographer.java:1158
android.os.Handler.handleCallback()Handler.java:873
android.os.Handler.dispatchMessage()Handler.java:99
android.os.Looper.loop()Looper.java:193
android.app.ActivityThread.main()ActivityThread.java:6863
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run()RuntimeInit.java:537
com.android.internal.os.ZygoteInit.main()ZygoteInit.java:858

有人可能會發現這很有用,我在 Xamarin Forms 中使用ScaleTo()時遇到此錯誤。 代碼在UWP 中運行良好,但是在 Android 上運行時(我在 Android KitKat 和 Android Pie 上嘗試過),我收到了這個錯誤: Java.Lang.IllegalArgumentException: 'Cannot set 'scaleX' to Float.NaN'

這個錯誤是因為我在async Task使用了ScaleTo()

這是我之前的代碼

void StartTimer()
{
    Task.Run(async () =>
    {
       await TimerBar.ScaleTo(0, 5000, null);
    });
}

但這給了我錯誤,因為我試圖修改主線程以外的線程上的 UI 元素。 請注意,所有 UI 活動都在Main Thread 上進行 更改或修改 UI 元素或其屬性在主線程以外的其他線程上不起作用。 在 Xamarin Forms 中,如果要將執行從主線程切換到另一個線程,請使用Device.BeginInvokeOnMainThread(async() => awaited code...;) 所以我對我的代碼進行了更改。

這是修改后的代碼

void StartTimer()
{
    Device.BeginInvokeOnMainThread(async () =>
    {
        await TimerBar.ScaleTo(0, 5000, null));
    });
}

另一種方法是直接從 XAML 頁面調用按鈕單擊

<Button Text="Start Timer" Clicked="StartTimer" />
async void StartTimer(object sender, EventArgs e)
{
    await TimerBar.ScaleTo(0, 5000, null);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM