【问题标题】:Blackberry App start Webservice Null黑莓App启动Webservice Null
【发布时间】:2013-01-26 00:24:30
【问题描述】:

我的应用程序启动后立即进行了版本命中检查。 但是当模拟器加载它发送请求和所有这些东西时。在我的应用程序启动后,它给出版本命中值 NULL,但在我关闭应用程序并再次打开它之后,它给出了正确的值。

1) 我的问题是为什么会发生这种行为,我应该怎么做应用程序启动和版本检查在第一次尝试时给出正确的值!

2) 用户甚至没有执行应用程序,为什么它的代码行被执行?????

public MyScreen()  { 
    Bitmap bitmap = Bitmap.getBitmapResource("background.png");
    this.getMainManager().setBackground(
            BackgroundFactory.createBitmapBackground(bitmap)); 

    synchronized (Application.getEventLock()) 
    {
        UiApplication.getUiApplication().invokeLater(new Runnable() 
        {
            public void run() 
            {
                Status.show("Please Wait...", Bitmap.getPredefinedBitmap(Bitmap.INFORMATION), 1000);
                LoginScreen();
            }
        }); 
    }

现在它的作用是它只显示背景屏幕,没有任何服务,但是当我再次启动它时它可以工作。有什么问题?谢谢

【问题讨论】:

  • 您没有在上面显示任何进行任何 Web 服务调用的代码。如果LoginScreen() 这样做,请显示该代码。另外,请澄清为什么要执行它的代码行是什么意思。您的意思是在用户使用普通图标启动应用程序之前,您会在应用程序中看到一些代码行? 哪些行代码?你上面显示的那些?您可能还需要显示您的主程序(主要的UiApplication 子类)。
  • 这是“MyApp”类代码:codepad.org/WiyIf4vy 这是“MyScreen Code”代码:
  • 您的意思是在这里发布更多代码吗?我只看到指向您的 MyApp.java 的链接,看不到 MyScreen 的其余部分。
  • 是的,已断开连接,这是 MyScreen 类代码:codepad.org/CpYsanuY 所以当我将它安装在设备/模拟器中时。在单击图标之前,它开始向 Web 服务发送调用。在单击启动图标之前,它会在第 579 行“NPE”中给出空指针异常。当我不使用 invokeLater 时,它会给出 RuntimeException ,或者如果我使用 Dialog 框,那么它会说 Can't show UI Component over event dispatcher。单击图标后,它只会显示背景屏幕,仅此而已。但是关闭应用程序并重新启动它不会产生这种行为并且工作正常。
  • 您是否在 BlackBerry_App_Descriptor.xml 文件中设置启动时自动运行

标签: web-services blackberry blackberry-simulator


【解决方案1】:

如果您的MyScreen 类实际上是一种Screen(通过继承),那么在这种情况下您无需同步事件锁。 Screen 的构造函数已经在 UI 线程上调用,因此,只需将代码简化为:

public MyScreen()  { 
    Bitmap bitmap = Bitmap.getBitmapResource("background.png");
    this.getMainManager().setBackground(
            BackgroundFactory.createBitmapBackground(bitmap)); 

    UiApplication.getUiApplication().invokeLater(new Runnable() 
    {
        public void run() 
        {
            Status.show("Please Wait...", Bitmap.getPredefinedBitmap(Bitmap.INFORMATION), 1000);
            LoginScreen();
        }
    }); 

此外,您也可以摆脱invokeLater() 电话,留下这个:

public MyScreen()  { 
    Bitmap bitmap = Bitmap.getBitmapResource("background.png");
    this.getMainManager().setBackground(
            BackgroundFactory.createBitmapBackground(bitmap)); 

    Status.show("Please Wait...", Bitmap.getPredefinedBitmap(Bitmap.INFORMATION), 1000);
    LoginScreen();

如果您只是想从后台线程安全地启动其run() 方法中的代码,或者如果您想排队运行它,您通常会使用invokeLater() 构造函数完成之后。

但是,如果您已经准备好让它立即发生,并且您只是使用该调用来确保

 Status.show("Please Wait...", Bitmap.getPredefinedBitmap(Bitmap.INFORMATION), 1000);
 LoginScreen();

已在 UI 线程上运行,那么就没有必要这样做,因为正如我所说,您已经在 MyScreen 构造函数中的 UI 线程上。

但是,我也看不到你在 MyScreen 构造函数的末尾做了什么,所以使用 invokeLater() 可能是合适的。

针对我上面的评论发布更多信息,我会尽力提供更多帮助。

【讨论】:

    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多