java – latch(用于等待异步响应)冻结WebView(和UI)
|
我有一个应用程序,在整个布局上显示webview.有时我需要调用异步方法,异步操作由三方sdk完成,然后我等待一段时间,直到我得到对指定监听器的响应.我用一个锁存器解决了它 – 一旦在监听器中收到响应,我就计算掉锁存器,然后启动方法可以继续这个响应.
为了更清楚,这是一个例子.我需要ajaxFunc等待MyAsyncListener获得某个响应,然后返回这个确切的响应. JS注入webview的一部分: var response = jsHandler.ajaxFunc(request.data); 我有一个名为response的变量全局变量. public class JavaScriptInterface
{
@JavascriptInterface
public String ajaxFunc(String data)
{
return MyUtils.handleData( data );
}
}
handleData方法: public String handleData( String data )
{
SomeClass.startAsyncRequest(); // starts the async request,response is to come at the listener's callbacks .
latch = new CountDownLatch(1);
try {
latch.await(30,TimeUnit.SECONDS);
}
catch (InterruptedException e) {
e.printStackTrace();
}
return response;
}
现在,一旦handleData函数调用一个异步执行的函数,async函数就会在一些Listener中返回一些答案: myAsyncListener = new MyAsyncListener() {
@Override
public Response handleEvent(CustomEvent event) {
//Now I need to return this 'event' back to the handData/ajaxFunc function <--
response = event.getName();
latch.countDown();
}
});
解决方法
由于您要分派异步请求,因此您不应期望响应会在您启动异步代码的同一方法调用中到达.如果这样做,调用程序线程将阻塞,直到异步响应到达,也就是说,它根本不会异步. 您可以将代码重新设计为以下内容: public class JavaScriptInterface {
@JavascriptInterface
public void ajaxFunc(String data) {
// draw a waiting animation or something
MyUtils.handleData(data);
}
}
public void handleData(String data) {
SomeClass.startAsyncRequest();
}
myAsyncListener = new MyAsyncListener() {
@Override
public void handleEvent(CustomEvent event) {
// Do what you need to do
// (update UI,call javascript etc.).
//
// Mind the thread that will execute this callback
// to prevent multithreading issues.
}
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
