我有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();");
}
必须在同一个线程上调用所有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();");
});