Почему EvaluateJavaScriptAsync не выполняется? - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть функция js getState (), которая возвращает свойство css (блок или нет) элемента, но оно не работает, Visual Studio выдает некоторые сообщения Thread:

09-14 23:30:22.081 W / WebView (6707): java.lang.Throwable: метод потока был вызван в потоке «Thread-12».Все методы WebView должны вызываться в одном потоке.(Ожидается, что Looper Looper (main, tid 2) {4aca651} вызван на нуль, основной FYI Looper - это Looper (main, tid 2) {4aca651}) 09-14 23: 30: 22.081 W / WebView (6707): на андроиде.webkit.WebView.checkThread (WebView.java:2539) 09-14 23: 30: 22.081 W / WebView (6707): atroid.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();");
        }

1 Ответ

0 голосов
/ 15 сентября 2018

Все методы WebView должны вызываться в одном потоке ... К вашему сведению основной Looper является Looper (основной, TID 2)

Вы используете Task.Run для выполнения метода, который в свою очередь вызывает EvaluateJavaScriptAsync, и, следовательно, вы не находитесь в потоке Main / UI. Вот что пытается сказать вам ошибка.

Итак, удалите Task.Run:

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

Или отправьте свой EvaluateJavaScriptAsync вызов в очередь сообщений / петлителей пользовательского интерфейса:

Device.BeginInvokeOnMainThread(async() =>
{
    retorno = await webnav.EvaluateJavaScriptAsync("getState();");
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...