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

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...