【问题标题】:Loading screen inside handleNavigationRequest in Browserfield Blackberry在浏览器字段黑莓中处理导航请求中的加载屏幕
【发布时间】:2013-11-21 07:49:01
【问题描述】:

在我的应用程序中,我正在使用 BrowserField 显示一个网站。当网站内的每个链接都被选中时,我需要显示加载屏幕,这样用户就不会感到空白。

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

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

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

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

public void handleNavigationRequest(BrowserFieldRequest request)

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

这是我的代码 sn-p

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 方法。但它没有被触发。下面给出的代码是sn-p,你能检查一下我在这里做错了什么吗......!!

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);

【问题讨论】:

    标签: blackberry loading browserfield


    【解决方案1】:

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

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

    更新

    据OP发现,缓存文章为here

    进一步更新

    澄清两点:

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

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

    【讨论】:

    • 谢谢彼得...!!我已经在 BrowserFieldListener 中尝试了 documentCreated 方法,这在等待建立连接时显示加载屏幕时出现了一些延迟。将按照您的建议尝试 documentUnloading。我在这篇文章supportforums.blackberry.com/t5/Java-Development/… 之后也实现了缓存,但我仍然没有在加载时获得那么多的性能提升。我希望这是你也提到的文章。
    • 我也尝试过 documentUnloading。但是该事件没有被触发。我已经更新了我的问题以包括我用于此的代码 sn-p。请检查一下!!
    • 也用那部分更新了问题..!!
    • 我也经历过并尝试过。添加了这个并调试了代码;但它不会用到 documentUnloading() 方法。但是 documentCreated() 和 documentLoaded() 方法被触发了……我很困惑……!! :-(
    • 知道为什么会这样吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多