Сервисный поток Blackberry вешает пользовательский интерфейс при выполнении - PullRequest
0 голосов
/ 13 июля 2011

В моем приложении blackberry я использую альтернативную точку входа и запускаю поток при запуске, который выполняет http-операцию, и через некоторое время один и тот же поток вызывается, скажем, через 3 минуты. Он работает, но проблема в том, что он зависает вот мой код.

final class sendUnsentService extends Thread {

Timer timer;
TimerTask repeatMe;

sendUnsentService me;

boolean working = false;

public boolean isWorking() {
    return working;
}

public void interrupt() {
    super.interrupt();

    System.out.println("___________________________[STOPSERVICE()]");
    try {
        timer.cancel();
    } catch (Exception e) {
        System.out
        .println("_______________________[PROBLEM STOPPING SERVICE]");
    }
}

public void run() {
    super.run();
    System.out.println("___________________________[STARTSERVICE()]");
    new Thread() {
        public void run() {
            timer.schedule(repeatMe, 0, 300000);
        };
    }.start();
}

public sendUnsentService() {
    me = this;
    ImageUtils.initPersistentStorage();
    timer = new Timer();

    repeatMe = new TimerTask() {

        public void run() {
            working = true;
            if (sendUnsentActivity()) {
                me.interrupt();
            }
            working = false;
        }
    };
}

Я вызываю эту ветку для некоторого взаимодействия с пользователем, используя этот код, а затем он вешает пользовательский интерфейс

try {
    helloBerry.service = new sendUnsentService();
} catch (Exception e) {
System.out.println("_____________1 " + e);
}
try {
    helloBerry.service.startService();
} catch (Exception e) {
System.out.println("_____________2 " + e);
}

и вот как я вызываю службу для запуска при загрузке устройства в основном методе с использованием альтернативной точки входа

if (args != null && args.length > 0 && args[0].equals("normal")) {
            System.out.println("_________[STARTING APP]");
___________some code here to show a screen
            }
        } else {
            System.out.println("_________[STARTING SERVICE]");
            service = new sendUnsentService();
            service.run();
        }

Ответы [ 2 ]

1 голос
/ 13 июля 2011

Первое, что я заметил, это то, что вы запускаете TimerTask из другого потока.Таймер содержит свой собственный поток, так что в этом нет необходимости - просто вызовите его напрямую.Кроме того, я не думаю, что вам нужно расширять поток.Что вы можете сделать, это использовать TimerTask, чтобы перепланировать себя, если он не дает ошибок, в противном случае просто дайте ему остановиться.

Что касается блокировки пользовательского интерфейса, если вы не выполняете какую-то странную синхронизацию в RuntimeStore, это не должно влиять на вашу основную программу.Он должен работать как два отдельных процесса, не подозревая друг друга.При каких обстоятельствах он замерзает?

0 голосов
/ 14 июля 2011

OMG! В конце концов я обнаружил, что проблема была довольно глупой - некоторые заявления sysout, которые я использовал для печати данных, которые я отправлял на сервер, спасибо jprofit за проявленный интерес

У меня есть еще один вопрос, связанный с этим, если вы можете ответить, я запускаю эту ветку на каком-то событии, поэтому, когда пользователь закрывает приложение, он также закрывает эту ветку. Я пытался расширить приложение вместо потока, но я не в состоянии справиться с этим. удаленно.

...