[英]Handling Callbacks with Webview Android
您好,我正在創建一個 Android 應用程序。 我不喜歡使用 Android 的 UI 系統,並選擇使用 WebView 進行 UI 設計,因為對於來自 HTML5 背景的我來說更容易。 我已經嘗試過像 Cordova 和 Phonegap 這樣的平台,但它們並沒有像我一樣給我確切的控制 ID,因為我也有 Java 背景。 所以重申一下,我僅將 WebView 用於 UI。
話雖如此,我想在 web 視圖(即網絡調用)上運行少量 JavaScript 代碼。 我有一個使用 OkHttp 的網絡后端,可以使這些連接正常。 但是我無法以對我目前對 webview 的了解友好的方式取回任何數據。
這是我的 JavaScript function 簽名:
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 ...
}
處理請求時,id 喜歡調用回調 function 一些方法。 像 EventListener 之類的,但我對類型“???”感到困惑應該是,或者我將如何 go 關於調用 function 以便 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);
}
});
}
Java代碼
@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 相同,我們可以以相同的方式進行通信。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.