Javascript 使用Webview Android处理回调

Javascript 使用Webview Android处理回调,javascript,java,android,webview,Javascript,Java,Android,Webview,您好,我正在创建一个Android应用程序。我不喜欢使用Androids UI系统,并且选择使用WebView进行UI设计,因为我来自HTML5背景,因此更容易使用WebView。 我曾经尝试过Cordova和Phonegap这样的平台,但是他们没有给我像我一样的控件id,因为我也有Java背景。所以重申一下,我只是将WebView用于UI 也就是说,我希望在web视图上运行少量JavaScript代码,即网络调用。我有一个网络后端使用OkHttp,可以使这些连接良好!但我无法以一种对我目前的网

您好,我正在创建一个Android应用程序。我不喜欢使用Androids UI系统,并且选择使用WebView进行UI设计,因为我来自HTML5背景,因此更容易使用WebView。 我曾经尝试过Cordova和Phonegap这样的平台,但是他们没有给我像我一样的控件id,因为我也有Java背景。所以重申一下,我只是将WebView用于UI

也就是说,我希望在web视图上运行少量JavaScript代码,即网络调用。我有一个网络后端使用OkHttp,可以使这些连接良好!但我无法以一种对我目前的网络视图知识友好的方式获取任何数据

这是我的JavaScript函数签名:

function makeRequest(method,url,data,callback){
    ... Code Here ...
}
我想这样称呼它:

makeRequest("GET","http://www.example.com/",{
    "key1" : "value1",
    "key2" : "value2"
},(code,responseJSON) => {
    ... Handle Response...
});
到目前为止,在我的Android/Java方面,我有以下几点:

@JavascriptInterface
public void makeRequest(String method, String url, String data, ??? callback){
    ... Handle Request Java-side ...
}
当处理请求时,我想如何调用回调函数。 就像一个EventListener之类的,但我不知道“?”应该是什么类型, 或者我将如何调用该函数,以便JavaScript代码能够接收 它的回调并继续

我已经有了通过我的JavaScriptInterface和webview工作的单向代码。 JSON是没有问题的,因为它在JS代码中转换为字符串,而GSON可以 解析并获取我需要的。就是这回电话把我难住了


提前感谢您的帮助:)

您可以这样做

public class MyJavaScriptInterface {
    private final MyJavaScriptInterfaceCallBack myJavaScriptInterfaceCallBack;

    public interface  MyJavaScriptInterfaceCallBack{
        void clickedAdmission(YourDataType code,String responseJSON);
    }
    public MyJavaScriptInterface(MyJavaScriptInterfaceCallBack myJavaScriptInterfaceCallBack) {
        this.myJavaScriptInterfaceCallBack=myJavaScriptInterfaceCallBack;
    }

    @JavascriptInterface
    public void applynow() {
        myJavaScriptInterfaceCallBack.clickedAdmission();
    }

}
然后在你的活动片段中

您的片段或活动必须在其中实现
MyJavaScriptInterface.MyJavaScriptInterfaceCallBack
接口和方法

在WebView中设置javascript接口

webView.addJavascriptInterface(new MyJavaScriptInterface(this), "YourRecognizer");

好的,看起来预期的行为是不可能的,但是使用API 21+您可以访问
Webview#postMessage()
方法在运行时之间来回对话。 我基本上是这样做的:

JavaScript代码

function makeHTTPRequest(method,url,data,callback){
    // may have to do a check on data
    var number = Math.floor(Math.random() * 1000);
    window.host.makeHTTPRequest(number,method,url,JSON.stringify(data));
    window.addEventListener("message",(ev) => {
        var JSONData = JSON.parse(ev.data);
        if(JSONData.id == number){
            callback(JSONData.code,JSONData.payload.data);
        }
    });
}
@JavascriptInterface
public void makeHTTPRequest(int id, String method, String url, String data){
    createRequest(id, method, url, data, new MethodCallBackInterface() {
        @Override
        public void done(String message) {
            parent.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    view.postWebMessage(new WebMessage(message), Uri.parse("*"));
                }
            });
        }
    });
}
Java代码

function makeHTTPRequest(method,url,data,callback){
    // may have to do a check on data
    var number = Math.floor(Math.random() * 1000);
    window.host.makeHTTPRequest(number,method,url,JSON.stringify(data));
    window.addEventListener("message",(ev) => {
        var JSONData = JSON.parse(ev.data);
        if(JSONData.id == number){
            callback(JSONData.code,JSONData.payload.data);
        }
    });
}
@JavascriptInterface
public void makeHTTPRequest(int id, String method, String url, String data){
    createRequest(id, method, url, data, new MethodCallBackInterface() {
        @Override
        public void done(String message) {
            parent.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    view.postWebMessage(new WebMessage(message), Uri.parse("*"));
                }
            });
        }
    });
}
ID
很重要!调用该方法时,我们必须生成一个ID,该ID发送到主Java应用程序,并包含在最终的JSON代码中,然后发送回JS代码。可以检查,如果相等,那么我们可以调用回调。在Java端使用线程,确保我所追求的异步性质,同时保持JS端的回调


此方法的工作方式与HTML中iFrame之间的通信方式相同。因此,如果我们将Android应用程序和out-Web应用程序视为沙盒iFrame,那么我们可以用同样的方式进行通信。

这仍然是一种方式,就像调用`` window.YourRecognitor.applynow()``一样,这是您访问此代码的方式。我试着这样调用:WebView JS代码(带回调)->Java代码->WebView JS代码回调。我认为最好的描述是传递一个函数,以便在异步任务完成后的稍后时间调用,并通过调用作为参数提供的函数(也称为回调)通知WebView/JS函数该过程已完成。看起来这可能不完全受支持!我能帮你吗