【问题标题】:Can I have a multi-process global variable?我可以有一个多进程全局变量吗?
【发布时间】:2011-12-26 21:05:27
【问题描述】:

我在使用涉及 2 个进程的应用时遇到了真正的问题。一个进程执行服务 (p1),另一个进程执行 GUI (p2)。

我在 p2 中有一个类,它实现了对自定义内存管理(及其静态)对象 (iThing) 的使用。必须像这样,因为 Android OS 实现了随时销毁视图。

public class Connections{
    public static int iGlobalCounter=0;
    public static Object iThing;

    public static void start(){
        iGlobalCounter++;
        Log.d("PROCESS", "UP: "+iGlobalCounter);
        if (iGlobalCounter<=1){
            //Create the object "iThing"
        }
    }

    public static int stop(){
        iGlobalCounter--;
        Log.d("PROCESS", "DOWN: "+iGlobalCounter);
        if (iGlobalCounter<=0){
            //Destroy the object "iThing"
        }
    }

}

主 GUI(在 p2 中),在 onCreate / onDestroy 上启动和停止变量(对于我的应用程序中的所有视图)

public class MyMainClass extends Activity{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Connections.start();
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
        Connections.stop();
    }

}

最后在 p1 中我有了服务,它也需要变量,所以,它也一样

public class MyMainService extends Service{
    @Override
    public void onCreate() {
        super.onCreate();
        Connections.start();
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
        Connections.stop();
    }

}

问题是,如果我只使用p2(GUI),一切都很好,但是当我执行服务(在p1中)时,计数器不是从上一个状态开始递增,而是从0开始,导致销毁离开服务时的对象,而不是应用程序。

如果进行此导航,我会得到以下计数器: MyMainClass (1) --> OtherClass (2) --> AnotherClass (3) --> MyMainService (1)

我的问题是是否有办法拥有一个多进程全局变量?似乎每个进程都有自己的静态变量,而不是“真正的静态”。一个解决方案可能是使用 SharedPreferences 来保存状态,但不是很好的解决方案,因为离开应用程序时它没有被保存。

谢谢, 波霸

【问题讨论】:

    标签: android variables process static global


    【解决方案1】:

    我认为你应该扩展 Application 类并将你的 globalVariable 放在那里。

    【讨论】:

    • 对不起,我刚试过,但一直发生同样的事情:两个进程,实例
    • 也许在这种情况下我们看到了一个并发的例子。将 Application 类中的 GlobalVariable 设为静态并编写它的同步更新程序。
    【解决方案2】:

    您可以将全局数据存储在共享内存中(请参阅MemoryFile)。 要同步对文件的访问,我认为最好的方法是使用相同的内存文件实现某种自旋锁。 在这种情况下,我不知道这样做的简单方法。

    【讨论】:

      【解决方案3】:

      您可以查看以下选项以在不同进程之间共享数据,

      消息队列,

      命名管道,

      内存映射文件

      命名管道或 MSMQ 上的 WCF

      【讨论】:

        猜你喜欢
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-26
        • 2012-06-18
        相关资源
        最近更新 更多