#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.