#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 является использование одного из следующих методов:
- Application.invokeLater (доступный для выполнения)
- Application.invokeAndWait (доступный для выполнения)
Итак, при появлении пользовательского события (щелчок) вы запускаете новое, Thread
которое выполняет сетевые (или некоторые другие потенциально длительные действия), и когда вам нужно обновить пользовательский интерфейс (например, нажать / всплыть Screen
, изменить внешний вид на Field
), тогда вы используете Application.invokeLater(Runnable runnable)
.
Также проверьте Обзор пользовательского интерфейса BB и Потоковая обработка пользовательского интерфейса BlackBerry — самые основы.