Интерфейс блокировки сетевых потоков - PullRequest
0 голосов
/ 12 января 2012

Я разрабатываю приложение для Blackberry, которое использует сетевые возможности.Запрос выполняется нажатием кнопки со следующим кодом:

mainButton=new BitmapButton(Bitmap.getBitmapResource("elcomercio.​gif"), Bitmap.getBitmapResource("elcomercio.gif"), Field.FOCUSABLE){
        protected boolean navigationClick(int status,int time) {
            //It automatically add itself to the screen stack
            waitScreen=new WaitScreen();
            TimeOutThread timeOut=new TimeOutThread(HomeScreen.this, 10000);
            HttpHelper helper=new HttpHelper("http://www.elcomercio.com/rss/latest", null, HomeScreen.this, HttpHelper.GET);
            UiApplication.getUiApplication().invokeLater(timeO​ut);
            UiApplication.getUiApplication().invokeLater(helpe​r);
            return true;
        }
    };

Как вы можете видеть, TimeOutThread и HttpHelper оба наследуются от Thread, так что они могут быть вызваны вне основного потока выполнения.Также они оба получают текущий экран в качестве объекта делегата, чтобы я мог выполнять методы позже на экране.в этом случае тайм-аут выполняет следующую функцию:

public void onTimeout() {
    if(!didTimeout.booleanValue()){
        UiApplication.getUiApplication().popScreen(waitScr​een);
        didTimeout=Boolean.TRUE;
    }
}

Метод тайм-аута успешно вызывается ... даже окно waitScreen успешно выводится, и отображается последний экран.Но пользовательский интерфейс в этот момент зависает ... это похоже на то, что HttpThread, который у меня был, все еще выполняет блокирование пользовательского интерфейса ... Я знаю это, потому что, когда сетевой поток истекает ... пользовательский интерфейс снова реагирует.Что я делаю не так ??.

1 Ответ

1 голос
/ 12 января 2012

UiApplication.invokeLater() не запускает объект Thread в своем собственном потоке выполнения.Вместо этого он запускает объект в главном потоке диспетчеризации событий - тот же поток, в котором выполняется ваш пользовательский интерфейс.Вам нужно использовать метод Thread.start() вместо метода UiApplication.invokeLater(), например:

mainButton = new BitmapButton(Bitmap.getBitmapResource("elcomercio.​gif"), Bitmap.getBitmapResource("elcomercio.gif"), Field.FOCUSABLE)
{
    protected boolean navigationClick(int status,int time)
    {
        waitScreen = new WaitScreen();
        TimeOutThread timeOut=new TimeOutThread(HomeScreen.this, 10000);
        HttpHelper helper = new HttpHelper("http://www.elcomercio.com/rss/latest", null, HomeScreen.this, HttpHelper.GET);
        timeO​ut.start();
        helpe​r.start();
        return true;
    }
};
...