Как добавить addGlobalEventListener в класс в ежевике? - PullRequest
3 голосов
/ 14 октября 2010

Я сделал проект с несколькими точками входа, где App2 настроен на автозапуск, а App1 запускается по запросу пользователя.Я пытаюсь вызвать глобальное событие из App1, полученное App2.

public class App2 implements GlobalEventListener {
    static public int counter = 0;
    public static final long countId = 0x1251402f595f81a5L;
    public static final long eventId = 0xba4b84944bb7429eL;

    private App2() {
        Application.getApplication().addGlobalEventListener(this);
    }

    public static App2 waitForSingleton() {
        counter = 2; // Added the counter in Runtime store in a similar way as
        // added in eventOccured method
        // Deleted some unuseful code
    }

    public void eventOccurred(long guid, int data0, int data1, Object object0,
            Object object1) {
        if (guid == eventId) {
            callMethodOnOccuranceOfEvent();
        }
    }

    public void callMethodOnOccuranceOfEvent() {
        counter++;
        RuntimeStore store = RuntimeStore.getRuntimeStore();
        Object obj = store.get(countId);
        if (obj == null) {
            store.put(countId, new Integer(counter));
        } else {
            store.put(countId, new Integer(counter));
        }
    }
}

Затем в другом классе я попробовал как

public class App1 extends MainScreen {
public App1() {
}

protected void makeMenu(Menu menu, int instance) {
    super.makeMenu(menu, instance);
    menu.add(new MenuItem("Call", 20, 10) {
        public void run() {
            callMethodonclick();
        }
    });
}

public void callMethodonclick() {
    ApplicationManager.getApplicationManager().postGlobalEvent(App2.eventId);
    RuntimeStore store = RuntimeStore.getRuntimeStore();
    Integer c = (Integer) store.get(App2.countId);
    add(new RichTextField("Event Recived#counter#" + c));
}

}

Если я вызову событие три раза

Event Recived#counter#2
Event Recived#counter#2
Event Recived#counter#2

, покаОжидаемый результат -

Event Recived#counter#3
Event Recived#counter#4
Event Recived#counter#5

, который, как я предполагаю, предполагает, что объект для App2 в не null, а eventOccurred никогда не вызывался.вывод ясно показывает, что callMethodonclick не может опубликовать глобальное событие, даже если в конструкторе было добавлено globalEventListener.

Ответы [ 2 ]

1 голос
/ 17 октября 2010

Должно быть так.

if (obj == null) {
     store.put(countId, new Integer(counter));
} else {
     store.replace(countId, new Integer(counter));
}

store.put () генерирует исключение IllegalArgumentException, поскольку в хранилище что-то есть (см. Справочник по API), но это исключение обрабатывается некоторым системным потокомвызывает метод eventOccured () и ничего не показывает об этом исключении.Это одна из различных ошибок Blackberry.

0 голосов
/ 15 октября 2010

Вы не обновляете текст в RichTextField. Он добавляется на экран только в том случае, если отсутствует объект хранения времени выполнения, связанный с App2.RTSID_MY_APP.

Ваш код должен сохранять дескриптор RichTextField, помещая его в поле объекта App1. Затем обновите текст в методе run ().

Я отредактировал ваш код, добавив фигурные скобки в оператор if, что делает это более понятным.

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