未捕获的异常没有应用程序实例

时间:2013-12-06 07:47:56

标签: blackberry

我正致力于处理多入口点方法的UI应用程序。

我指的是link并尝试制作演示版。 这是代码: -

public class DemoApp extends UiApplication implements  RealtimeClockListener
{

    private static DemoApp dmMain ;
    private static final long dm_APP_ID =  0x6ef4b845de59ecf9L;

    private static DemoApp getDemoApp()
    {
        if(dmMain == null)
        {
            RuntimeStore dmAppStore = RuntimeStore.getRuntimeStore();

            dmMain =  (DemoApp)dmAppStore.get(dm_APP_ID);
        }


        return dmMain;
    }

    private static void setDemoApp(DemoApp demoAppMain)
    {
        RuntimeStore dmAppStore = RuntimeStore.getRuntimeStore();
        dmAppStore.remove(dm_APP_ID);
        dmAppStore.put(dm_APP_ID, demoAppMain);
    }

    public static void main(String[] args) 
    {
        Log.d(" Application argument  "+args);

        if( args.length > 0 && args[ 0 ].equals( "Demo_Alternate" ) )
        {
            Log.d("Running Demo_Alternate #### Running Demo_Alternate #### Running Demo_Alternate");

            dmMain = new DemoApp();
            dmMain.enterEventDispatcher();

            setDemoApp(dmMain);
        }
        else
        {
            Log.d("Running Demo #### Running Demo #### Running Demo #### Running Demo");

            getDemoApp().initializeMain();
        }
    }

    public DemoApp() 
    {
        this.addRealtimeClockListener(this);
    }

    private void initializeMain() 
    {
        UiApplication.getUiApplication().invokeLater(new Runnable() 
        {
            public void run() 
            {
                try 
                {
                    pushScreen(new DemoMainScreen());

                } catch (Exception e) 
                {
                    Log.e(e.toString());
                }
            }
        });



    }

    public void clockUpdated() 
    {
        showMessage("DemoAppClock Updated");
        Log.d("DemoAppClock Updated #### DemoAppClock Updated #### DemoAppClock Updated");
    }


    private void showMessage(String message) 
    {
        synchronized (Application.getEventLock()) 
        {
            Dialog dlg = new Dialog(Dialog.D_OK, message, Dialog.OK, null, Manager.FIELD_HCENTER);
            Ui.getUiEngine().pushGlobalScreen(dlg, 1, UiEngine.GLOBAL_QUEUE);
        }
    }

    }

: - 我创建了一个名为 Demo_Alternate 的备用入口点,它在启动时运行。
   : - 如果应用程序具有单独的入口点,则意味着单独的过程link

现在我的问题是: -

  1. 在运行代码时,我得到“未捕获的异常:没有应用程序实例”
  2. 我只想制作一个应用程序实例 - 不想要单独的进程
  3. 我们可以使用(应用程序) Singleton 方法进行备用入口点吗?

2 个答案:

答案 0 :(得分:1)

只是简单地看一下这段代码,但在这里看到一个明显的问题:

      dmMain.enterEventDispatcher();
      setDemoApp(dmMain);

enterEventDispatcher永远不会返回,因此您永远不会将您的Application实例放在RuntimeStore中。

我建议您查看以下知识库文章,您可能会发现其访问RuntimeStore维护对象的方法更易于使用。或者不是。

Singleton using RuntimeStore

<强>更新

如果此解决方案不起作用,请使用更正后的代码更新原始帖子。

答案 1 :(得分:0)

我当然同意彼得的意见,即在 setDemoApp(dmMain)之后调用enterEventDispatcher() 意味着它不会被调用。

那就是说,我认为你在这里有一个更基本的误解。

使用备用切入点会创建多个流程。 See here for more

但是,你说你不想要单独的进程。你能告诉我们为什么不

例如,旨在协同工作的单独BlackBerry流程仍可以共享数据using the RuntimeStore

也许你可以告诉我们更多关于你的“Demo”和“Demo Alternate”应该做什么。