簡體   English   中英

使用 Webview Android 處理回調

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM