簡體   English   中英

如何在 JCEF 中創建持久查詢

[英]How to create persistent queries in JCEF

關於我的應用

我有一個混合應用程序,我在其中使用JCEF (java 鉻嵌入式框架)。

我想要達到的目標

使用 JCEF 的 IPC 功能設置一個簡單的訂閱系統。 其中之一是消息路由

里面相關的 class ( CefMessageRouter.java )。 它討論了一些用例:

// Some possible usage patterns include:
//
// 1.One-time Request. ...
// 2.Broadcast. ...
// 3.Subscription. Use a persistent query to register as a JavaScript subscription
//    receiver. The Handler initiates the subscription feed on the first request
//    and delivers responses to all registered subscribers as they become
//    available. The Handler cancels the subscription feed when there are no
//    longer any registered JavaScript receivers.

第三個選項是我想要的。 如您所見,它需要持久查詢。

我試過的

在我的主要 class 中:

CefMessageRouter msgRouter = CefMessageRouter.create(new CefMessageRouterConfig("cefQuery", "cefQueryCancel"));
msgRouter.addHandler(new MessageRouterHandler(), isTransparent);
        
client_ = cefApp_.createClient();
client_.addMessageRouter(msgRouter);

MessageRouteHandler.java

//imports...    
public class MessageRouterhandler implements CefMessageRouterHandler{

    @Override
    public void setNativeRef(String identifer, long nativeRef) {}

    @Override
    public long getNativeRef(String identifer) { return 0;}

    @Override
    public boolean onQuery(CefBrowser browser, CefFrame frame, long queryId, String request, boolean persistent,
            CefQueryCallback callback) {
        
        callback.success("{\"by\": \"cat\", \"message\": \"I hate you\"}");
        callback.success("{\"by\": \"dog\", \"message\": \"I love you\"}");
        
        return true;
    }

    @Override
    public void onQueryCanceled(CefBrowser browser, CefFrame frame, long queryId) {}
}

來自 javascript

window.cefQuery({
            request: 'get-data',
            persistent: true,
            onSuccess: function(response) {
                console.log(response)
            },
            onFailure: function(error_code, error_message) {
                console.log(error_code+":"+error_message);
            }
        })

Output

通過此設置,我除了進入控制台之外:

{"by": "cat", "message": "I hate you"}
{"by": "dog", "message": "I love you"}

我實際得到的是:

{"by": "cat", "message": "I hate you"}

我不明白為什么因為文檔說:

// If the query is persistent then the callbacks will remain registered until one of the
// following conditions are met:
//
// A. The query is canceled in JavaScript using the |window.cefQueryCancel|
//    function.
// B. The query is canceled in C++ code using the Callback::Failure function.
// C. The context associated with the query is released due to browser
//    destruction, navigation or renderer process termination.

就我而言,似乎沒有滿足任何條件。 但是回調不會保持注冊狀態。

問題

這是一個錯誤還是我遺漏了什么? 如果這是一個錯誤。 我可以探索其他選擇嗎?

編輯:

剛發現有像我這樣的人在持久查詢方面遇到同樣的問題。 這個問題有問題: https://bitbucket.org/chromiumembedded/java-cef/issues/186

一個查詢只能有一個響應。 因此,您的第二個 success() 調用將被忽略。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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