почему метод WebView.evaluateJavascript вызывается дважды?

#javascript #android #webview #evaluatejavascript

#javascript #Android #webview #evaluatejavascript

Вопрос:

общедоступная статическая строка dataFromJs;

 public void androidMethod() {
    // initialize static String dataFromJs.
    dataFromJs = "";
    webView.evaluateJavascript("javascript:jsFuction();", new ValueCallback<String>() {
        @RequiresApi(api = Build.VERSION_CODES.O)
        @Override
        public void onReceiveValue(String s) {
            JsonReader reader = new JsonReader(new StringReader(s));
            reader.setLenient(true);
            try {
                if (reader.peek() != JsonToken.NULL) {
                    if (reader.peek() == JsonToken.STRING) {
                        // get string value from javascript and I want to use the value
                        dataFromJs = reader.nextString();
                    }
                }
            } catch (IOException e) {
                Log.e("TAG", "MainActivity: IOException", e);
            } finally {
                try {
                    reader.close();
                } catch (IOException e) {
                    // NOOP
                }
            }
        }
    });

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            if(url.endsWith("menu/page.do")) {
                androidMethod();
                // do something with dataFromJs..
            }
    }
 

androidMethod — это мой метод в Android.
Я пытаюсь использовать str, который я получил от javascript.
но метод WebView.evaluateJavascript всегда возвращает null в первый раз,
WebView.evaluateJavascript вызывается снова и возвращает строковое значение правильно.

Поскольку в первый раз возвращаемое значение равно null, я не могу использовать метод androidMethod в другом методе.

У кого-нибудь есть хорошее решение??

это как-то связано с этим журналом (приложение может выполнять слишком много работы в своем основном потоке.)?

Спасибо!

Комментарии:

1. Покажите другой ваш код, который выполняет вызов

2. Я отредактировал код. Переопределенный метод onReceiveValue имеет только возвращаемый тип void, поэтому я пытаюсь использовать общедоступную статическую строку dataFromJs . Я хочу использовать значение из javascript после ввода dataFromJs, но evaluateJavascript возвращает null и не вызывается обратный вызов onReceiveValue в первый раз. Затем возникает ошибка в if(url.EndsWith(«menu /page.do»)) {androidMethod(); // сделайте что-нибудь с dataFromJs, но ошибка возникает с dataFromJs «» }

3. Я обнаружил, что моя проблема заключалась в том, что evaluateJavascript является Asyn. Но нет ли способа создать общий метод с evaluateJavascript? Я думаю, что каждый раз, когда я получаю данные из javascript, его приходится подключать к wirte evaluateJavascript.