处理Webview Android的回调



你好,我正在创建一个Android应用程序。我不喜欢使用android UI系统,选择使用WebView进行UI设计,因为它对我来说更容易来自HTML5背景。我尝试过像Cordova和Phonegap这样的平台,但他们没有给我确切的控制id,因为我也有Java背景。所以只是重申一下,我使用的WebView仅用于UI。

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

这是我的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);
}
});
}
<<p>Java代码/strong>
@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应用程序和我们的Web应用程序作为沙盒iframe,我们可以以同样的方式进行通信。

最新更新