Могу ли я иметь многопроцессорную глобальную переменную? - PullRequest
2 голосов
/ 27 декабря 2011

У меня реальная проблема с использованием моего приложения, которое включает 2 процесса.Один процесс выполняет службу (p1), а другой - графический интерфейс (p2).

У меня есть класс в p2, который реализует использование объекта (iThing), который управляется пользовательской памятью (и его статической),Это должно быть похоже на эту реализацию ОС Android, которая уничтожает представления в любое время.

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"
        }
    }

}

Основной графический интерфейс (в 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 для сохранения состояния, но не очень хорошее решение, поскольку его не нужно сохранять при выходе из приложения.

Спасибо, PAU

Ответы [ 3 ]

1 голос
/ 27 декабря 2011

Я думаю, что вы должны расширить Application класс и поместить туда globalVariable.

0 голосов
/ 30 сентября 2014

У вас есть следующие опции, которые вы можете использовать для обмена данными между различными процессами,

Очередь сообщений,

Именованные каналы,

Файлы с отображением в памяти

WCF на именованных каналах или MSMQ

0 голосов
/ 23 октября 2013

Вы можете хранить свои глобальные данные в общей памяти (см. MemoryFile ). Я думаю, что для синхронизации доступа к файлу лучше всего реализовать некую спин-блокировку, используя тот же файл памяти. В любом случае, я не знаю простого способа сделать это.

...