2013-02-03 91 views
0

我有一个BlackBerry App,它具有在CheckIn屏幕中实现的发送按钮的监听器。数据通过Web服务发送。如果数据发送成功,则收到确认消息“OK”。我试图根据收到的响应切换BlackBerry App中的屏幕。BlackBerry中的切换屏幕

FieldChangeListener sendBtnListener = new FieldChangeListener() { 
     public void fieldChanged(Field field, int context) 
     { 
      try { 
       String alertMsg=sendTextCheckIn(); 
       if(alertMsg.equals("OK")) 
       { 
        UiApplication.getUiApplication().invokeLater(new Runnable() 
        { 
         public void run() 
         { 
          UiApplication.getUiApplication().pushScreen(new MyScreen()); 
         } 
        }); 
       } 
      } catch (UnsupportedEncodingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }; 

但是,以上是投掷App Error 104: IllegalStateException。任何人都可以请指导如何切换BlackBerry App之间的屏幕。

编辑:我可以切换到任何其他屏幕,但我不能切换到MyScreenNOTE:自选画面是应用程序的主要(第一个)屏幕。上述方法sendTextCheckIn()调用放置在MyScreen内的另一种方法。这与这个错误有什么关系?请指教。

+2

'sendTextCheckIn()'方法是否实际进行网络调用?如果是这样,你不应该像''fieldChanged()'那样调用它。您应该使用后台'Thread'来运行该调用。当'sendTextCheckIn()'得到响应时,你应该使用'invokeLater()'调用'pushScreen()'。 – Nate

回答

3

'fieldChanged'事件已经在UI事件线程上运行,所以你不需要在其中执行invokeLater调用,直接调用pushScreen。

您提到您的IllegalStateException问题只发生在自选画面上。这听起来像是实现MyScreen特有的东西。开始缩小问题的范围 - 查看“自选画面”的构造函数中发生的情况以及在屏幕可见之前可能调用的任何事件。其中一些代码是导致问题的原因。

1

在try/catch中包装可能引发异常的所有东西。

不要做e.printStackTrace() - 那不会给你太多。

而是做一些类似于System.err.println ("KABOOM in method abc() - " + e);的东西 - 看起来像是更多的努力,但相信我,在调试这样的问题时变成INVALUABLE。

捕获Exception,除非你有一个非常好的理由来捕获一个特定的子类型 - 否则你会以意想不到的和未捕获的异常,你会寻找DAYS。