异步JavaScript在Android的WebView要求 [英] Asynchronous JavaScript calls from Android WebView

查看:221
本文介绍了异步JavaScript在Android的WebView要求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在建设有web视图,与设备通信与 JavaScriptInterface 注释

I'm building hybrid Android app with WebView that communicates with the device with JavaScriptInterface annotation

从web视图:

webView.addJavascriptInterface(someService, "someService");

服务实现:

@JavascriptInterface
public void someMethod() {
    //do some business logic..
}

问题是,从我的JavaScript运行它是这样的:

Problem is that from the JavaScript I run it like this:

function callSomeMethod() {
    someService.someMethod()
};

此调用是同步的,想的东西,将异步运行,如:

This call is synchronous, and would like something that will run asynchronously like:

function callSomeMethod(callback) {
    someService.someMethod(function(result) {
        if (result == 'success')
            callback();
    })
};

pferably使用承诺$ P $:

Preferably using promise:

function callSomeMethod() {
    return someService.someMethod()
    //someMethod returns promise
};

Android版是否已经WebView中内置支持运行的JavaScript code异步?

Does Android WebView has built in support for running JavaScript code asynchronously?

推荐答案

这完全取决于你。你只需要从注入的方法立即返回,而是能够调用JS code执行完成时。像这样的东西(请注意,这只是一个草图):

That solely depends on you. You just need to return immediately from the injected method, but be able to call JS code when the execution is complete. Something like this (note that it's only a rough sketch):

private WebView mWebView;
private final Object mLock = new Object();
private String mJsCallbackCode;

@JavascriptInterface
public void someMethod(String jsCallbackCode) {
    synchronized (mLock) {
        mJsCallbackCode = jsCallbackCode;
    }
    // Start some business logic asynchronously, and return back here immediately.
    return;
}

public void onBusinessLogicCompleted(bool success) {
    String jsCallbackCode;
    synchronized (mLock) {
        jsCallbackCode = mJsCallbackCode;
    }
    mWebView.loadUrl("javascript:" + jsCallbackCode + "(" + success + ");void(0);");
}

和在JavaScript中使用它是这样的:

And in JavaScript you use it like this:

function callSomeMethod(callback) {
    window._someMethodCallback = callback;
    someService.someMethod(
        '(function(success){' +
        '    if (success) window._someMethodCallback();' +
        '    delete window._someMethodCallback;' +
        '})'
    );
};    

这样的想法是,你通过JS code,你需要被召回的作为一个字符串的(因为你不能传递一个真正的JS对象)。这code将被称为在全球范围内。

So the idea is that you pass the JS code you need to be called back as a string (because you can't pass a real JS object). This code will be called in the global context.

需要在Java中锁定因为JS调用的方法在一个专门的线程上运行,而不是在你的应用程序的UI线程。

Locking in Java is needed because methods called from JS run on a dedicated thread, not on your app's UI thread.

需要注意的是在并购preVIEW,一个API 的postMessage 已添加到网页视图,使发布的Java和JS code之间的异步消息。

Note that in M preview, an API for postMessage has been added to WebView, enabling to post asynchronous messages between Java and JS code.

这篇关于异步JavaScript在Android的WebView要求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆