在浏览器字段Blackberry中的handleNavigation请求中加载屏幕

时间:2013-11-21 07:49:01

标签: blackberry loading browserfield

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

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

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

1 个答案:

答案 0 :(得分:0)

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

是的,一般来说,BrowserField比浏览器慢。我还没找到办法绕过它。然而,一个重要方面是缓存。查找有关为BrowserField创建自己的缓存的信息 - 这里有Thread和BB Web站点上的KB文章。抱歉找不到他们,我会更新。

<强>更新

由OP发现,缓存文章为here

进一步更新

只是澄清两件事:

  1. 您必须使用addListener方法将Listener与BrowserField相关联。
  2. 假设您为BrowserField的初始加载执行通常的requestContent(),您将需要自己推送加载屏幕,因为将调用的侦听器中的第一个方法(假设它当然有效)将是documentLoaded ()。
  3. 此处包含演示如何使用Listener的示例: listener sample