Java: обмен инкрементной переменной - PullRequest
0 голосов
/ 20 января 2012

Я делаю приложение BlackBerry, и мне нужно разделить общую переменную в моем приложении между различными точками входа. Переменная представляет собой простой счетчик, который отслеживает количество уведомлений на главном экране значка. Каждый раз, когда запланированное фоновое приложение обновляется, оно будет увеличивать переменную count, которая затем используется setValue (count) для его отображения. Кто-то предложил использовать подход singleton и runtimestore. Я искал этот метод и нашел фрагмент кода на форуме:

Integer i = new Integer(0);
RuntimeStore.getInstance().put(ID, i);
i.setValue(7);

//On other module:
Integer i = (Integer) RuntimeStore.getInstance().get(ID);

Моя проблема в том, что я до сих пор не знаю, как правильно использовать этот код, я также посмотрел на

http://docs.blackberry.com/en/developers/deliverables/17952/CS_creating_a_singleton_by_using_rutnime_store_1554335_11.jsp

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

public void setVisible1(boolean visible, int count) {
    if (_indicator != null) {
        if (visible) {
            _indicator.setVisible(true);
            _indicator.setValue(++count);   //incrementing count
            UserInterface.iconCount++;      // also trying here
        } else {
            _indicator.setVisible(false);
        }
    }
}

Использование RuntimeStore.getInstance (). Put (GUID, countsIcon); в моем классе UserInterface создает ошибки, вероятно, потому что я либо использую его неправильно или не в правильном месте. Я только недавно начал разработку Blackberry и Java, так что это очень ново для меня. Я приложил основную часть своего кода ниже, если это поможет.

Еще раз спасибо за любую помощь, это было бы очень признательно!


public class UserInterface extends UiApplication {
        static int iconCount;  //stores the value of the icon number
        public static void main(String[] args) {
        if (args != null && args.length>0 && "startVibrate".equals(args[0])){
            scheduleVibrate();
        }
        else{
            UserInterface theApp = new UserInterface();
            theApp.enterEventDispatcher();
        }
    }
    static MyAppIndicator SV = new MyAppIndicator();
    private static void scheduleVibrate()
    {
        SV.setVisible1(true,iconCount);
        Alert.startVibrate(2550); 
        ApplicationDescriptor current =     ApplicationDescriptor.currentApplicationDescriptor();
        current.setPowerOnBehavior(ApplicationDescriptor.DO_NOT_POWER_ON);
        ApplicationManager manger = ApplicationManager.getApplicationManager();
        manger.scheduleApplication(current,System.currentTimeMillis()+1000,true);
    }
    public UserInterface() {
        pushScreen(new UserInterfaceScreen());
    }
}


public class MyAppIndicator{

public ApplicationIndicator _indicator; 
public static MyAppIndicator _instance; 

MyAppIndicator () {
    setupIndicator();
}
public static MyAppIndicator getInstance() {
    if (_instance == null) {
        _instance = new MyAppIndicator ();
    }
    return(_instance);
}
public void setupIndicator() {

    //Setup notification 
    if (_indicator == null) {
        ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry.getInstance();
        _indicator = reg.getApplicationIndicator();

        if(_indicator == null) {
            ApplicationIcon icon = new ApplicationIcon(EncodedImage.getEncodedImageResource ("notificationsdemo_jde.png"));
            _indicator = reg.register(icon, false, true);  
            _indicator.setValue(0);
            _indicator.setVisible(false);
        }
    }
}

public void setVisible1(boolean visible, int count) {
    if (_indicator != null) {
         if (visible) {
            _indicator.setVisible(true);
            _indicator.setValue(++count);   //incrementing count
            UserInterface.iconCount++;      // also trying here
        } else {
            _indicator.setVisible(false);
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 20 января 2012

Прочитайте статью RIM о синглетонах . Как говорится, статические переменные инициализируются для каждого процесса. Используйте Runtimetore, чтобы все процессы получили доступ к одному одноэлементному объекту.

Я собирался отредактировать код здесь, но мне было легче разместить его в моем блоге: http://www.hrbuckley.net/2012/01/using-singleton-classes-in-blackberry.html

0 голосов
/ 20 января 2012

Просто создайте класс, поместите эту переменную в этот класс и расширьте этот класс в каждом другом классе, где вы хотите получить доступ к переменной. Измените значение переменной counter в любом классе, оно будет автоматически отражено в других классах. Не забудьте объявить это статическим

0 голосов
/ 20 января 2012

Статическая переменная - это все, что вам нужно, но, похоже, она у вас уже есть (iconCount).Если он работает не так, как вы хотите, вы можете попробовать создать другой класс, который отслеживает iconCount со статической переменной, к которой можно получить доступ из классов, к которым вы хотите иметь доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...