我有一个应用程序,在整个布局上显示webview.有时我需要调用异步方法,异步操作由三方sdk完成,然后我等待一段时间,直到我得到对指定监听器的响应.我用一个锁存器解决了它 – 一旦在监听器中收到响应,我就计算掉锁存器,然后启动方法可以继续这个响应.
不幸的是,当我这样做时,WebView被卡住了.我想象本机用户界面会被卡住,但我没想到webview也会被冻结.
怎么能克服?
不幸的是,当我这样做时,WebView被卡住了.我想象本机用户界面会被卡住,但我没想到webview也会被冻结.
怎么能克服?
为了更清楚,这是一个例子.我需要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(); } });
解决方法
I need the ajaxFunc to wait until MyAsyncListener gets a certain response,and then return this exact response.
由于您要分派异步请求,因此您不应期望响应会在您启动异步代码的同一方法调用中到达.如果这样做,调用程序线程将阻塞,直到异步响应到达,也就是说,它根本不会异步.
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. } }