java – latch(用于等待异步响应)冻结WebView(和UI)

前端之家收集整理的这篇文章主要介绍了java – latch(用于等待异步响应)冻结WebView(和UI)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个应用程序,在整个布局上显示webview.有时我需要调用异步方法,异步操作由三方sdk完成,然后我等待一段时间,直到我得到对指定监听器的响应.我用一个锁存器解决了它 – 一旦在监听器中收到响应,我就计算掉锁存器,然后启动方法可以继续这个响应.
不幸的是,当我这样做时,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.
    }
}

猜你在找的Java相关文章