【问题标题】:Uncaught exception no application instance未捕获的异常没有应用程序实例
【发布时间】:2013-12-06 07:47:55
【问题描述】:

我正在开发处理多个入口点方法的 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. 我们可以将(应用程序)单例方法用于备用入口点吗?

【问题讨论】:

    标签: blackberry


    【解决方案1】:

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

          dmMain.enterEventDispatcher();
          setDemoApp(dmMain);
    

    enterEventDispatcher 永远不会返回,因此您永远不会将应用程序实例放入 RuntimeStore。

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

    Singleton using RuntimeStore

    更新

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

    【讨论】:

    • ..我试过这种方法 dmMain = new DemoApp(); setDemoApp(dmMain); dmMain.enterEventDispatcher(); ..得到相同的异常..这意味着我们不能使用这种方法。
    【解决方案2】:

    我当然同意 Peter 的观点,调用 setDemoApp(dmMain) after enterEventDispatcher() 意味着它不会被调用。

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

    使用备用入口点将创建多个进程。 See here for more

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

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

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

    【讨论】:

    • 有一个用例,您只需要一个应用程序实例,但还希望它在设备启动时启动 - 这也是问题中链接的 BB 知识库文章所暗示的内容。备用条目不必创建不同的应用程序。例如,它可以只添加侦听器。或者只是将它知道的现有应用程序放在前台 - 我认为这就是这张海报试图做的事情。
    • 也许......根据这个问题和马里奥的其他问题,我不相信这个用例真的是他所追求的。无论如何,我认为他最好澄清他正在尝试做的事情。尽管如此,这两个入口点会导致两个单独的进程调用main(),对吧?您仍然可以拥有一个 Application 单例实例,例如,如果他只想要 一个 应用程序对象,那将保持一些持久状态(并不是说这是实现该状态的唯一方法)。我只是想了解他想要完成什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多