Проблема синхронизации потоков в Blackberry - PullRequest
0 голосов
/ 07 апреля 2011

В моем приложении мне нужно установить соединение Http с веб-сервером, соединение http устанавливается, когда пользователь выбирает элемент ListField. Он работает правильно, я написал метод для установления http-соединения, и он возвращает результат, и моя программа обрабатывает эти данные.

Но он зависает из-за того, что метод, который я написал, не в отдельном потоке (метод, который я написал для установления http-соединения, находится в одноэлементном классе). Теперь я изменил свой метод в отдельном потоке, теперь я получил недопустимое исключение состояния потока.

Итак, я изменил свой класс (класс HttpConnection - теперь он не одноэлементный), теперь нет исключений недопустимого состояния, но я не получаю желаемый результат.

У меня меньше опыта в Java и BlackBerry, я не знаю, как синхронизировать два потока. Поэтому я ввожу статическую переменную 'i', когда программа входит в поток, она становится равной 0, а когда она получает ответ http, она меняется на 1.

Итак, моя программа ждет с помощью цикла while и проверяет значение i. Когда он становится равным 1, я получаю ответ http (который также является статической строковой переменной). Но теперь и моя программа зависает бесконечно, я знаю, что это не очень хороший метод.

Пожалуйста, помогите решить проблему, поделившись своими идеями о синхронизации потоков, ссылочных кодах и т. Д.

Это мой метод бега:

public void run() {
    i =0;
    observerStatusUpdate(i, "Please Wait");
    StreamConnection streamConnection=null;
    InputStream inputStream=null;
    HttpConnection httpConnection = null;
    String result="";
    try {
        streamConnection=(StreamConnection)Connector.open(url);
        httpConnection=(HttpConnection)streamConnection;
        httpConnection.setRequestMethod(HttpConnection.GET);
        //httpConnection.setRequestProperty("Content-Type", "//json");
        int httpStatus=httpConnection.getResponseCode();
        if(httpStatus==HttpConnection.HTTP_OK){
            inputStream = streamConnection.openInputStream();
            //byte[] radioTimeData=new byte[8000];
            byte radioTimedataByte;                 
            while((radioTimedataByte=(byte)inputStream.read())!=-1){
                result=result+(char)radioTimedataByte;
            }

            httpres = result;   
            setResult(result);
            i=1;

            observerStatusUpdate(i, "");
        }
    } catch (IOException e) {   
        i=1;
        UiApplication.getUiApplication().invokeLater(new Runnable() {

            public void run() {
                Dialog.alert("No Internet Connectivity");   
                //System.exit(0);
            }
        });
        System.out.println(e);
    }

И он вызывается с использованием другого класса, например

grabAPIFactory.setUrl(newUrl,o1);           
grabAPIFactory.start();
grabAPIFactory.setPriority(Thread.MAX_PRIORITY);
while(GrabapiFactory.i==0){
    Thread.sleep();
}
string httpresult = GrabapiFactory.httpres;// static variale getting result from server
// process the httpresult here.....

1 Ответ

2 голосов
/ 07 апреля 2011

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

По сути, все, что вам нужно знать: когда вы находитесь в потоке, не являющемся пользовательским интерфейсом, вам нужно сделать что-то в потоке пользовательского интерфейса, тогда на BB обычно используется один из следующих методов:

Таким образом, при пользовательском событии (щелчке) вы запускаете новый Thread, который выполняет сетевое взаимодействие (или некоторые другие потенциально длительные действия) и когда вам нужно обновить пользовательский интерфейс (например, нажать / выдвинуть Screen, изменить появление на Field), тогда вы используете Application.invokeLater(Runnable runnable).

Также проверьте Обзор интерфейса пользователя BB и Потоки пользовательского интерфейса BlackBerry - основы .

...