Два примечания относительно кода, который вы разместили:
- Сетевые операции (точнее, я бы сказал, что все операции, не связанные с пользовательским интерфейсом) должны выполняться в отдельном рабочем потоке, а не в основном потоке событий (поток пользовательского интерфейса в случае
UIApplication
).
- Если вам нужен доступ к пользовательскому интерфейсу извне потока пользовательского интерфейса, вы можете использовать методы
Application
invokeLater()
или invokeAndWait()
. В качестве альтернативы рабочий поток может синхронизироваться при блокировке события (возвращаемой Application.getEventLock()
) для обеспечения сериализованного доступа к пользовательскому интерфейсу. Обратите внимание, что вы должны удерживать эту блокировку только в течение коротких периодов времени.
Что касается симулятора BlackBerry и HTTP - для тестирования приложения BlackBerry, использующего HTTP-соединение с симулятором BlackBerry, необходимо использовать службу подключения BlackBerry MDS (Mobile Data System). Здесь - ссылка на соответствующее руководство.
Запуск службы подключения BlackBerry MDS при запуске симулятора смартфона BlackBerry
- В Eclipse® в меню «Выполнить» выберите «Отладка конфигураций» или «Запуск конфигураций».
- Разверните пункт Симулятор BlackBerry.
- Выполните одно из следующих заданий:
- Чтобы работать с существующей конфигурацией запуска, в разделе BlackBerry Simulator щелкните конфигурацию запуска.
- Чтобы создать новую конфигурацию запуска, щелкните правой кнопкой мыши BlackBerry Simulator и выберите «Новый».
- Перейдите на вкладку Симулятор.
- Откройте вкладку Общие.
- Установите флажок Запустить службу подключения к мобильной системе данных (MDS-CS) с помощью симулятора.
- Нажмите Применить.
Я также настоятельно рекомендую вам проверить пример HTTPDemo, который поставляется с загруженными вами JRE (вы установили хотя бы одну JRE, если вы можете скомпилировать свой код). Здесь - руководство по импорту этих образцов в плагин Eclipse.
Что касается вашего кода, я изменил его для соответствия упомянутым требованиям:
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.container.MainScreen;
public class HTTPClient extends UiApplication {
private LabelField labelField;
public static void main(String[] args) {
HTTPClient theApp = new HTTPClient();
theApp.enterEventDispatcher();
}
public HTTPClient() {
MainScreen httpScreen = new MainScreen();
labelField = new LabelField();
httpScreen.add( labelField);
pushScreen(httpScreen);
new Thread() {
public void run() {
getPage("http://google.com");
}
}.start();
}
public void getPage(String url) {
try {
StreamConnection s = (StreamConnection) Connector.open(url);
InputStream input = s.openInputStream();
byte[] data = new byte[256];
int len = 0;
StringBuffer raw = new StringBuffer();
while (-1 != (len = input.read(data))) {
raw.append(new String(data, 0, len));
}
input.close();
s.close();
show(raw.toString());
} catch (Exception e) {
}
}
public void show(final String response) {
Thread t = new Thread() {
public void run() {
labelField.setText(response);
}
};
UiApplication.getUiApplication().invokeLater(t);
}
}