2013-11-21 3 views
0

В моем приложении я показываю веб-сайт с использованием BrowserField. И когда выбрана каждая ссылка внутри сайта, мне нужно показать экран загрузки, чтобы пользователь не почувствовал себя пустым.Загрузка экрана внутри handleNavigationRequest в Browserfield Blackberry

я был в состоянии добавить экран загрузки внутри этого метода

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() и удаляю его в документеLoaded(). Когда я впервые заполняю BrowserField, я также выталкиваю экран загрузки, и когда экран с браузером закрыт, я делаю так, что экран загрузки также выставляется. Так что это не очень приятное решение, но оно работает для меня.

И да, в общем, BrowserField работает медленнее, чем браузер. Я не нашел пути вокруг него. Однако одним из важных аспектов является кеширование. Посмотрите информацию о создании собственного кеша для BrowserField - здесь есть статья и статья KB на веб-сайте BB. Извините, не могу найти их atm, будет обновляться, когда я это сделаю.

Update

Как было выяснено в ОП, кэширование статья here.

Дальнейшее обновление

Просто чтобы прояснить две вещи:

  1. необходимо связать Слушатель с BrowserField, используя метод AddListener.
  2. Предполагая, что вы используете обычный requestContent() для начальной загрузки вашего браузера, вам нужно нажать экран загрузки самостоятельно, потому что первый метод в слушателе, который будет вызываться (при условии, что он работал, конечно), будет documentLoaded().

образец, демонстрирующий, как использовать Слушатель включен здесь: listener sample

+0

Спасибо Питер ... !! Я пробовал метод documentCreated в BrowserFieldListener, и это давало некоторую задержку в показе экрана загрузки, поскольку он ждет, чтобы установить соединение. Попробуйте загрузить документацию, а также предложите. Я реализовал кэширование также после этой статьи http://supportforums.blackberry.com/t5/Java-Development/How-to-Implement-a-Web-Cache-for-Your-BrowserField2-Application/ta -p/817911 Но все же я не получаю такого увеличения производительности при загрузке. Надеюсь, это статья, о которой вы также говорили. – Kris

+0

Я тоже пытался загрузить документацию. Но это событие не срабатывает. Я обновляю свой вопрос, чтобы включить фрагмент кода, который я использовал для этого. Вы не могли бы проверить !! – Kris

+0

Обновлен вопрос с этой частью ... !! – Kris

Смежные вопросы