0

在我的应用程序中,我正在使用 BrowserField 显示一个网站。And when each link inside the site is selected, I need to show loading screen so that the user won't feel blank.

我能够在此方法中添加加载屏幕

public void documentCreated(BrowserField browserField,
                            ScriptEngine scriptEngine, Document document)

但问题是只有在建立连接时才会调用此方法,因此在显示加载屏幕之前会有延迟。

所以我尝试实现 ProtocolController 并在这个方法中添加加载屏幕

public void handleNavigationRequest(BrowserFieldRequest request)

但是,加载屏幕仍然会在一小段延迟后显示(与在 documentCreated 方法下时相同)

这是我的代码片段

public void handleNavigationRequest(BrowserFieldRequest request)
            throws Exception {

        if (!NetworkUtil.isNetworkAvailable()) {
            Dialog.inform(Strings.NETWORK_ERROR);
        } else {

            UiApplication.getUiApplication().invokeAndWait(new Runnable() {
                 public void run() {
                     BaseScreen.showLoadingProgress(Strings.LOADING);
                 }
             });

            InputConnection ic = handleResourceRequest(request);
            browserField.displayContent(ic, request.getURL());
        }
    }

我也在线程之外尝试过这个......仍然发生同样的事情。为了进行测试,我在此方法中添加了一个对话框,它在我单击站点内的任何链接的同时出现。只有这个加载屏幕需要时间来加载。

有什么办法可以做到这一点?

此外,与本机浏览器相比,浏览器字段加载网站所需的时间更长。

我在这里错过了什么吗!请帮忙

我已经按照您的建议尝试了 documentUnloading 方法。但它没有被触发。下面给出的是代码片段,请您检查一下我在这里做错了什么......!

protected void onUiEngineAttached(boolean attached) {
        if (attached) {

            BaseScreen.showLoadingProgress(Strings.LOADING);

        }
        super.onUiEngineAttached(attached);
    }

try {
                listener = new BrowserFieldListener() {

                    // Page starts loading...
                    public void documentCreated(BrowserField browserField,
                            ScriptEngine scriptEngine, Document document)
                             {

                        // show the loading screen
                        //showLoadingProgress(Strings.LOADING);
                    }

                    public void documentError(BrowserField browserField,
                            Document document)  {
                        hideLoadingProgress();
                        Dialog.inform(Strings.NETWORK_ERROR);
                    }

                    public void documentAborted(BrowserField browserField,
                            Document document) { 
                        hideLoadingProgress();
                        Dialog.inform(Strings.NETWORK_ERROR);
                    }

                    public void documentUnloading(BrowserField browserField,
                            Document document) {

                        BaseScreen.showLoadingProgress(Strings.LOADING);
                    }

                    // Page loaded
                    public void documentLoaded(BrowserField browserField,
                            Document document) {

                        // the document has loaded, hide loading popup ...
                        BaseScreen.hideLoadingProgress();
                    }

                };
            } catch (Exception ex) {
                Dialog.inform(Strings.NETWORK_ERROR);
            }

browserField.addListener(listener);
            // add the browser field to a ui manager or screen
            add(browserField);

            // request the content
            browserField.requestContent(URL);
4

1 回答 1

0

我使用 BrowserFieldListener 执行此操作(请参阅BrowserFieldListener.html)。这有点违反直觉,但我在 documentUnloading() 中显示加载屏幕,并在 documentLoaded() 中将其删除。当我第一次填充 BrowserField 时,我也会推送加载屏幕,当 BrowserField 的屏幕关闭时,我确保加载屏幕也被弹出。所以不是一个很好的解决方案,但它对我有用。

是的,一般来说,BrowserField 比 Browser 慢。我还没有找到解决办法。然而,一个重要方面是缓存。查找有关为 BrowserField 创建自己的缓存的信息 - 这里有 Thread 和 BB 网站上的知识库文章。抱歉找不到他们atm,当我找到时会更新。

更新

正如 OP 所发现的,缓存文章在这里

进一步更新

只是为了澄清两件事:

  1. 您必须使用 addListener 方法将 Listener 与 BrowserField 相关联。
  2. 假设您为 BrowserField 的初始加载执行通常的 requestContent(),您将需要自己推送加载屏幕,因为侦听器中将被调用的第一个方法(当然假设它已经工作)将是 documentLoaded()。

此处包含演示如何使用侦听器的示例: 侦听器示例

于 2013-11-21T11:06:10.187 回答