BrowserField и потерянное соединение

У меня есть приложение, которое использует поле браузера для подключения к веб-странице. Все работает нормально, и симулятор показывает нужную страницу.

Если для свойства сети симулятора установить значение "Вне зоны покрытия" и щелкнуть ссылку на моей веб-странице, я получу исключение - в BrowserFieldConnectionManagerImpl.

Как можно поймать это исключение, чтобы я мог предпринять соответствующие действия?

Приложение использует BlackBerry SDK

Код здесь:

открытый финальный класс example_Screen extends MainScreen {

// Create the ErrorHandler class
public class MyBrowserFieldErrorHandler extends BrowserFieldErrorHandler {
    protected MyBrowserFieldErrorHandler(BrowserField browserField){
        super(browserField);
    }

    public void displayContentError(String url, String errorMessage) {
        System.out.println("JERRY: displayContentError" + url);
        System.out.println("JERRY: displayContentError" + errorMessage);
    }

    public void displayContentError(String url, InputConnection connection, Throwable t) {
        displayContentError(url, t.getMessage());
    }

    public void navigationRequestError(BrowserFieldRequest request, Throwable t) {
        displayContentError(request.getURL(), t.getMessage());
    }

    public void requestContentError(BrowserFieldRequest request, Throwable t) {
        displayContentError(request.getURL(), t.getMessage());
    }

    public InputConnection resourceRequestError(BrowserFieldRequest request, Throwable t) {
        displayContentError(request.getURL(), t.getMessage());
        InputConnection connection = null;
        return connection;
    }   

}


/**
 * Creates a new example_Screen object
 */
public example_Screen() {

    GIFEncodedImage ourAnimation = (GIFEncodedImage) GIFEncodedImage.getEncodedImageResource("2.gif");       

    AnimatedGIFField _ourAnimation = new AnimatedGIFField(ourAnimation, Field.FIELD_HCENTER + Field.FIELD_VCENTER);
    this.add(_ourAnimation);
    LabelField _ourLabelField = new LabelField("Updating ...", Field.FIELD_HCENTER + Field.FIELD_VCENTER);
    this.add(_ourLabelField);                   

    int anim_ht = _ourAnimation.getPreferredHeight();
    int label_ht = _ourLabelField.getPreferredHeight();

    EncodedImage ei = EncodedImage.getEncodedImageResource("img/menu.png");       

    int currentWidthFixed32 = Fixed32.toFP(ei.getWidth());
    int currentHeightFixed32 = Fixed32.toFP(ei.getHeight());

    int displayWidthFixed32 = Fixed32.toFP(Display.getWidth());
    int displayHeightFixed32 = Fixed32.toFP((Display.getHeight() - anim_ht - label_ht));

    int scaleXFixed32 = Fixed32.div(currentWidthFixed32, displayWidthFixed32);
    int scaleYFixed32 = Fixed32.div(currentHeightFixed32, displayHeightFixed32);

    ei = ei.scaleImage32(scaleXFixed32, scaleYFixed32);

    BitmapField bmp = new BitmapField(ei.getBitmap(), Field.FIELD_HCENTER + Field.FIELD_VCENTER);
    add(bmp);      

    BrowserFieldConfig myBrowserFieldConfig = new BrowserFieldConfig();
    myBrowserFieldConfig.setProperty(BrowserFieldConfig.NAVIGATION_MODE, BrowserFieldConfig.NAVIGATION_MODE_POINTER);       
    BrowserField browserField = new BrowserField(myBrowserFieldConfig);
    add(browserField);

    browserField.requestContent("http://www.bbc.co.uk");

    BrowserFieldListener listener = new BrowserFieldListener() {
        public void documentAborted(BrowserField browserField, Document document) {
            System.out.println("JERRY: documentAborted");
        }

        public void documentCreated(BrowserField browserField, ScriptEngine scriptEngine, Document document) {
            System.out.println("JERRY: documentCreated");
        }

        public void documentError(BrowserField browserField, Document document) {
            System.out.println("JERRY: documentError");
        }

        public void documentLoaded(BrowserField browserField, Document document) {
            System.out.println("JERRY: documentLoaded");  

            Node node = document.getFirstChild();
            String nodeText = node.getTextContent();            
            int index = -1;
            if (nodeText != null) {             
                String errorText = "Error requesting content for:";                 
                index = nodeText.indexOf(errorText); 
            }

            Screen screen = browserField.getScreen();   
            try {
                synchronized (Application.getEventLock()) {
                    if (index == -1) {
                        System.out.println("JERRY: documentLoaded: no error");
                        int count = screen.getFieldCount();
                        if (count > 1) {
                            screen.deleteRange(0, (count-1));  
                            System.out.println("JERRY: documentLoaded: " + (count-1) + " fields deleted");
                        } else {
                            System.out.println("JERRY: documentLoaded: only 1 field so none deleted");
                        }
                    } else {
                        System.out.println("JERRY: documentLoaded: error");
                    }
                }
            } catch (final Exception ex) {
                System.out.println("example_Screen: documentLoaded: exception caught: " + ex.toString());
            }               

        }

        public void documentUnloading(BrowserField browserField, Document document) {
            System.out.println("JERRY: documentUnloading");
        }

        public void downloadProgress(BrowserField browserField, ContentReadEvent event) {
            System.out.println("JERRY: downloadProgress");
        }

    };
    browserField.addListener(listener);

    // Attach the Error Handler to the BrowserField
    BrowserFieldErrorHandler eHandler = new MyBrowserFieldErrorHandler(browserField);
    browserField.getConfig().setProperty(BrowserFieldConfig.ERROR_HANDLER, eHandler);

}  

}

1 ответ

BrowserField содержит метод addListener(), который принимает ссылку на реализацию BrowserFieldListener.

простираться BrowserFieldListener и обрабатывать ошибки в методах documentError() а также documentAborted() этой реализации.

Затем добавьте ссылку на экземпляр вашего класса, который расширяет BrowserFieldListener в поле вашего браузера через browserField.addListener(browserFieldListener);,

РЕДАКТИРОВАТЬ:

Если это не работает, используйте класс BrowserFieldErrorHandler из API RIM. Создайте свой собственный обработчик ошибок и передайте его экземпляр конфигурации браузера.

Ниже приведен пример кода:

// Create the ErrorHandler class
public class MyBrowserFieldErrorHandler extends BrowserFieldErrorHandler {
  public void displayContentError(String url, String errorMessage) {
    String error = "Error: (url=" + url + "): " + t.getMessage();
    Dialog.ask(Dialog.D_OK, error);
    logMessage(“BrowserFieldError: “ + error );
  }

 public void displayContentError(String url, InputConnection connection, Throwable t) { 
    displayContentError(url, t.getMessage());
 }

 public void requestContentError(BrowserFieldRequest request, Throwable t){
  displayContentError(request.getURL(), t.getMessage());
 }
}

// Attach the Error Handler to the BrowserField
BrowserFieldErrorHandler eHandler = new MyBrowserFieldErrorHandler();
browserField.getConfig().setProperty(BrowserFieldConfig.ERROR_HANDLER,eHandler);

Я получил этот пример кода от DevCon2010 презентации возможностей BrowserField. Вы можете получить его здесь: http://dev.tuyennguyen.ca/wp-content/uploads/2011/02/DEV49.pdf

Другие вопросы по тегам