Проблема с синхронизацией потоков в blackberry

#blackberry #java-me

#ежевика #java-me

Вопрос:

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

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

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

У меня меньше опыта работы с java и blackberry, я не знаю, как синхронизировать два потока. Итак, я ввожу статическую переменную ‘i’, при входе программы в поток она становится 0, а при получении http-ответа она меняется на 1.

Итак, in ожидает мою программу, используя цикл 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 = resu<   
            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. Не видя соответствующих частей вашего кода, мы можем только догадываться, в чем проблема.

3. поскольку мой код длинный, я не добавлял его, спасибо

Ответ №1:

Судя по вашему описанию, вам следует пересмотреть архитектуру вашего приложения. Я считаю, что эти циклы sigletons / waiting — это хакерские / уродливые способы делать то, что вам нужно.

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

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

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