Android webview 阻塞 evaluateJavascript
Android webview blocking evaluateJavascript
我正在尝试在我的 web 视图中评估具有阻塞功能的 Javascript 查询。含义函数线程等待结果。但是,evaluateJavascript 和 ValueCallback 都在主线程上调用,并且主线程暂停等待结果,这意味着等待永远无法捕获结果。这是我的例子,
private String getFirstUser(){
String evS = "document.getElementsByClassName(\"hm-user\")[0].innerHTML";
final CountDownLatch cdl = new CountDownLatch(1);
final StringBuilder sb = new StringBuilder();
try{
evaluateJavascript(evS, new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
if(value != null && value.length() != 0 && !value.equals("null")){
sb.append(value);
}
cdl.countDown();
}
});
cdl.await(200, TimeUnit.MILLISECONDS);
}catch (Exception e){};
return sb.length() == 0 ? null : sb.toString();
}
发生的事情是,回调不会发生,直到 await 被解除阻塞,这意味着函数总是 return null?
我做错了什么?我已经将它用于 http 请求并且它有效。
编辑:我知道像 Android main thread blocking WebView thread 这样的类似话题
但是,没有可用的解决方案。
由于调用 onReceiveValue
不会是同步的,并且如果您想使其同步会涉及阻塞您的主线程,我建议您避免这样做。不要尝试将其实现为同步调用,而是实现回调并让它以异步方式继续。
您可以通过以下方式实现:
private void getFirstUser(final ValueCallback<String> valueCallback){
String evS = "document.getElementsByClassName(\"hm-user\")[0].innerHTML";
final StringBuilder sb = new StringBuilder();
try{
evaluateJavascript(evS, valueCallback);
}catch (Exception e){
valueCallback.onReceiveValue(null);// You can pass any value instead of null.
};
}
调用方法时只需做:
getFirstUser(new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
if(value != null && value.length() != 0 && !value.equals("null")){
//do something with proper value
}else{
// take necessary action if value is null
}
}
});
我正在尝试在我的 web 视图中评估具有阻塞功能的 Javascript 查询。含义函数线程等待结果。但是,evaluateJavascript 和 ValueCallback 都在主线程上调用,并且主线程暂停等待结果,这意味着等待永远无法捕获结果。这是我的例子,
private String getFirstUser(){
String evS = "document.getElementsByClassName(\"hm-user\")[0].innerHTML";
final CountDownLatch cdl = new CountDownLatch(1);
final StringBuilder sb = new StringBuilder();
try{
evaluateJavascript(evS, new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
if(value != null && value.length() != 0 && !value.equals("null")){
sb.append(value);
}
cdl.countDown();
}
});
cdl.await(200, TimeUnit.MILLISECONDS);
}catch (Exception e){};
return sb.length() == 0 ? null : sb.toString();
}
发生的事情是,回调不会发生,直到 await 被解除阻塞,这意味着函数总是 return null?
我做错了什么?我已经将它用于 http 请求并且它有效。
编辑:我知道像 Android main thread blocking WebView thread 这样的类似话题 但是,没有可用的解决方案。
由于调用 onReceiveValue
不会是同步的,并且如果您想使其同步会涉及阻塞您的主线程,我建议您避免这样做。不要尝试将其实现为同步调用,而是实现回调并让它以异步方式继续。
您可以通过以下方式实现:
private void getFirstUser(final ValueCallback<String> valueCallback){
String evS = "document.getElementsByClassName(\"hm-user\")[0].innerHTML";
final StringBuilder sb = new StringBuilder();
try{
evaluateJavascript(evS, valueCallback);
}catch (Exception e){
valueCallback.onReceiveValue(null);// You can pass any value instead of null.
};
}
调用方法时只需做:
getFirstUser(new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
if(value != null && value.length() != 0 && !value.equals("null")){
//do something with proper value
}else{
// take necessary action if value is null
}
}
});