2012-09-07 54 views
2

我有一个应用程序使用browserfield连接到一个网页。 一切正常,模拟器显示正确的页面。BrowserField和丢失连接

如果我设置了仿真网络属性为“不在服务区”,然后点击我的网页的链接上,然后我得到一个异常 - 在BrowserFieldConnectionManagerImpl

如何能赶上这个例外,所以我可以采取适当的行动?

该应用使用BlackBerry SDK

的代码是在这里:

公共最终类example_Screen扩展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); 

} 

}

+0

你在谈论WebWorks/PhoneGap应用程序或基于Java的应用程序吗?请注意,在你的问题。 – 2012-09-07 14:26:27

+0

我编辑的问题 - 它的基于Java的应用 – AndroidJerry

回答

2

BrowserField包含方法,addListener()这需要参考BrowserFieldListener实施。

延伸BrowserFieldListener并且在该实现的方法documentError()documentAborted()中处理错误。

然后通过browserField.addListener(browserFieldListener);将您的班级实例的参考添加到您的浏览器字段BrowserFieldListener

编辑:

如果这不起作用,然后用BrowserFieldErrorHandler类从RIM API。构建您自己的错误处理程序并将其实例传递给browserfield配置。

下面,有示例代码:

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

我得到的BrowserField能力DevCon2010演示此示例代码。你可以在这里得到它:http://dev.tuyennguyen.ca/wp-content/uploads/2011/02/DEV49.pdf

+1

嗨拉斐尔,感谢您的回答....但我已经尝试过。 documentError和documentAborted回调没有被调用。我只是得到一个例外。我正在使用8900模拟器进行测试。 – AndroidJerry

+0

我已经更新了我的答案。请检查一下。 – 2012-09-10 08:25:47

+0

嗨拉斐尔,感谢关于BrowserFieldErrorHandler的提示。不幸的是,这仍然行不通。我编辑了我的问题来添加我的代码(我的执行过程中可能犯了一个错误!)。 – AndroidJerry