单身通过几个过程?

时间:2012-02-07 12:34:53

标签: java android

如何编写单例来处理多个进程?可能吗? 例如,我的代码适用于Android中的远程服务。我怎样才能为此目的编写单例?

3 个答案:

答案 0 :(得分:3)

这个帖子已经过时了,但目前接受的答案是错误的,误导了一些人,所以我们走了。

Android中的服务可以在与您的应用相同的流程上运行,也可以在不同的流程上运行。

如果这是您自己的应用程序为其内部使用定义的服务,则它可能在同一进程上运行。只是不要设置任何process attributes on the Manifest。在这种情况下,您的服务将在主线程或某些后台线程上运行其任务,并将与您的应用程序的其余部分共享相同的单例实例。

如果这是在单独的进程或单独的应用程序上运行的真正的远程服务,那么您要实现的目标要困难得多。每个进程都有自己的单例实例,它们之间没有任何关联。一旦您意识到不同的进程可能甚至没有运行相同版本的代码,这就非常有意义。

如果确实希望跨进程拥有一个公共对象(提示:你几乎肯定不会),你需要为其数据创建一个共享内存空间,并实现一些方法同步我确信那个主题有完整的大学讲座。

答案 1 :(得分:0)

您创建的远程服务将始终为单例。您需要使用界面来使用Android界面定义语言在进程之间进行通信。

Android Interface Definition Language

参见此示例 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html

答案 2 :(得分:-2)

public enum MySingleton {
   SOLE;
   //all class stuff
}

这是一个简单编写,懒惰和线程安全的单例。您可以直接使用MySingleton.SOLE或将其放到其他变量中,但它们都只是对一个实例的引用。您可以在任意数量的流程中使用它,它可以满足所有需求。 (Android中的进程真的是线程)

这不是我的想法,而是来自Effective Java, Second Edition

对于使用全球数据(请将该要求纳入问题),您可以从任何地方到达MySingleton.SOLE。静态常量是全局的。当然,名字将是你的。

当然,任何事情都有它的解决方法。你可以通过类加载来欺骗这个单例。

如果你真的想要为几个不同的任务而不是线程创建一个实例,那么简单的解决方案将是单独构建为Hybernate或其他ORM对象。所有进程都将在同一个表中看到具有相同数据的同一行。但我认为这对你的任务来说太过分了。