Экран загрузки внутри handleNavigationRequest в Browserfield Blackberry

Внутри своего приложения я показываю веб-сайт с помощью 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);

person Kris    schedule 21.11.2013    source источник


Ответы (1)


Я делаю это с помощью BrowserFieldListener (см. BrowserFieldListener.html). Это немного противоречит интуиции, но я показываю экран загрузки в documentUnloading () и удаляю его в documentLoaded (). Когда я впервые заполняю BrowserField, я также нажимаю на экран загрузки, а когда экран с BrowserField закрывается, я убеждаюсь, что экран загрузки тоже появляется. Это не очень хорошее решение, но оно работает для меня.

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

Обновить

Как обнаружил OP, статья о кешировании имеет вид здесь.

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

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

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

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

person Peter Strange    schedule 21.11.2013
comment
Спасибо, Питер ... !! Я пробовал использовать метод documentCreated в BrowserFieldListener, и это давало некоторую задержку в отображении экрана загрузки, пока он ожидает установления соединения. Попробую documentUnloading так же хорошо, как вы предложили. Я реализовал кеширование также после этой статьи supportforums.blackberry.com/t5/Java-Development/ Но все же я не получаю такого большого прироста производительности при загрузке. Надеюсь, это статья, на которую вы тоже ссылались. - person Kris; 21.11.2013
comment
Я тоже пробовал documentUnloading. Но это событие не запускается. Я обновил свой вопрос, включив в него фрагмент кода, который я использовал для этого. Вы не могли бы проверить !! - person Kris; 21.11.2013
comment
Обновил вопрос и с этой частью .. !! - person Kris; 21.11.2013
comment
Я прошел через это и попробовал это тоже. Добавил это и отладил код; но это не шло к методу documentUnloading (). Но срабатывали методы documentCreated () и documentLoaded () ... Я запутался ... !! :-( - person Kris; 21.11.2013
comment
Есть идеи, почему это происходит? - person Kris; 22.11.2013
comment
Нет, извините, у меня это работает. Есть проблемы с реализацией BrowserField на некоторых симуляторах. Может попробовать другой? - person Peter Strange; 23.11.2013