为什么没有执行EvaluateJavaScriptAsync?

问题描述 投票:0回答:1

我有js函数getState()返回一个元素的css属性(块或无)但它不工作,visual studio给出了一些线程消息:

09-14 23:30:22.081 W / WebView(6707):java.lang.Throwable:在线程'Thread-12'上调用WebView方法。必须在同一个线程上调用所有WebView方法。 (预期Looper Looper(主,tid 2){4aca651}呼叫null,FYI主Looper是Looper(主,tid 2){4aca651})09-14 23:30:22.081 W / WebView(6707):在android。 webkit.WebView.checkThread(WebView.java:2539)09-14 23:30:22.081 W / WebView(6707):在android.webkit.WebView.evaluateJavascript(WebView.java:1054)线程完成:#4

任何人都可以找出错误在哪里?此外,当这个工作时,返回的类型可以与标签文本相关联,或者它不是一个简单的字符串?

我的代码:

        public static Label label1;
        public static WebView webnav;
        StackLayout parent = null;
        public MainPage()
        {
            InitializeComponent();
            webnav = new WebView
            {
                HeightRequest = 1000,
                WidthRequest = 1000,
                Source = "https://www.example.com/test.html",

            };
            webnav.Navigated += WebView_Navigated;

            label1 = new Label
            {
                WidthRequest = 900,
                HeightRequest = 60,
                Text = "default text"
            };

            parent = new StackLayout();
            parent.Children.Add(webnav);
            parent.Children.Add(label1);
            Content = parent;
        }

        public void WebView_Navigated(object sender, WebNavigatedEventArgs e)
        {
            Task.Run(JSRun);
        }

        public static string retorno;
        public static async Task JSRun()
        {
            retorno = await webnav.EvaluateJavaScriptAsync("getState();");
        }
c# android xamarin xamarin.forms xamarin.android
1个回答
1
投票

必须在同一个线程上调用所有WebView方法... FYI主Looper是Looper(main,tid 2)

您正在使用Task.Run执行一个方法,该方法又调用EvaluateJavaScriptAsync,因此您不在Main / UI线程上。这就是错误试图告诉你的。

所以删除Task.Run:

public void WebView_Navigated(object sender, WebNavigatedEventArgs e)
{
    JSRun();
}

或者将您的EvaluateJavaScriptAsync调用发布到UI消息/ looper队列:

Device.BeginInvokeOnMainThread(async() =>
{
    retorno = await webnav.EvaluateJavaScriptAsync("getState();");
});
© www.soinside.com 2019 - 2024. All rights reserved.