2013-11-21 68 views
0

在我的應用程序中,我使用BrowserField顯示網站。當網站內的每個鏈接被選中時,我需要顯示加載屏幕,以便用戶不會感到空白。在Browserfield Blackberry中的handleNavigationRequest中加載屏幕

我能加入這個方法

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

回答

0

我這樣做使用BrowserFieldListener(請參閱BrowserFieldListener.html)。它有點反直觀,但我在documentUnloading()中顯示加載屏幕,並在documentLoaded()中將其刪除。當我第一次填充BrowserField時,我也推動加載屏幕,當BrowserField屏幕關閉時,我確保加載屏幕也彈出。所以不是一個漂亮的解決方案,但它適用於我。

是的,一般來說,BrowserField比瀏覽器慢。我還沒有找到方法。然而,一個重要的方面是緩存。查找關於爲BrowserField創建自己的緩存的信息 - 這裏有Thread和BB Web站點上的知識庫文章。對不起,找不到atm,會在我更新時更新。

更新

由於發現的OP,緩存文章here

進一步更新

只是爲了澄清兩兩件事:

  1. 必須與BrowserField監聽器,使用的addListener方法關聯。
  2. 假設您爲BrowserField的初始加載執行通常的requestContent(),您將需要自己推送加載屏幕,因爲偵聽器中的第一個方法將被調用(假設它當然已經工作),將爲documentLoaded ()。

一個演示如何使用監聽器在這裏包括: listener sample

+0

感謝彼得...!我已經嘗試過BrowserFieldListener中的documentCreated方法,並且在等待建立連接時顯示加載屏幕時出現延遲。將嘗試documentUnloading以及你建議。 我也在本文後面實現了緩存 http://supportforums.blackberry.com/t5/Java-Development/How-to-Implement-a-Web-Cache-for-Your-BrowserField2-Application/ta -p/817911 但是我仍然沒有在加載時獲得那麼多的性能提升。我希望這是你也提到的文章。 – Kris

+0

我也試過documentUnloading。但是這個事件沒有被觸發。我已經更新我的問題以包含我用於此的代碼片段。你可以請檢查! – Kris

+0

更新了該部分的問題。 – Kris