Приложение Blackberry нельзя открыть в симуляторе - PullRequest
1 голос
/ 15 февраля 2012

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

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 {
LabelField test;

MainScreen screen = new MainScreen();

public static void main(String[] args)
{
HTTPClient theApp = new HTTPClient();
theApp.enterEventDispatcher();
}

public HTTPClient()
{
getPage("http://google.com");
}

public void getPage(String url) {
String response = "";
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));
}
response = raw.toString();
show(response);

input.close();
s.close();
} catch(Exception e) { }
}

public void show(String response) {
test = new LabelField(response);
screen.add(test);
pushScreen(screen);
}
}

Ответы [ 3 ]

1 голос
/ 18 февраля 2012

Два примечания относительно кода, который вы разместили:

  1. Сетевые операции (точнее, я бы сказал, что все операции, не связанные с пользовательским интерфейсом) должны выполняться в отдельном рабочем потоке, а не в основном потоке событий (поток пользовательского интерфейса в случае UIApplication).
  2. Если вам нужен доступ к пользовательскому интерфейсу извне потока пользовательского интерфейса, вы можете использовать методы Application invokeLater() или invokeAndWait(). В качестве альтернативы рабочий поток может синхронизироваться при блокировке события (возвращаемой Application.getEventLock()) для обеспечения сериализованного доступа к пользовательскому интерфейсу. Обратите внимание, что вы должны удерживать эту блокировку только в течение коротких периодов времени.

Что касается симулятора BlackBerry и HTTP - для тестирования приложения BlackBerry, использующего HTTP-соединение с симулятором BlackBerry, необходимо использовать службу подключения BlackBerry MDS (Mobile Data System). Здесь - ссылка на соответствующее руководство.

Запуск службы подключения BlackBerry MDS при запуске симулятора смартфона BlackBerry

  1. В Eclipse® в меню «Выполнить» выберите «Отладка конфигураций» или «Запуск конфигураций».
  2. Разверните пункт Симулятор BlackBerry.
  3. Выполните одно из следующих заданий:
    • Чтобы работать с существующей конфигурацией запуска, в разделе BlackBerry Simulator щелкните конфигурацию запуска.
    • Чтобы создать новую конфигурацию запуска, щелкните правой кнопкой мыши BlackBerry Simulator и выберите «Новый».
  4. Перейдите на вкладку Симулятор.
  5. Откройте вкладку Общие.
  6. Установите флажок Запустить службу подключения к мобильной системе данных (MDS-CS) с помощью симулятора.
  7. Нажмите Применить.

Я также настоятельно рекомендую вам проверить пример 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);
    }
}
0 голосов
/ 15 февраля 2012

Если значок есть, вероятно, приложение .cod развернуто в симуляторе.Я бы изменил ваше приложение для отображения статической метки в окне;это даст вам понять, что приложение действительно запущено.

В общем, работа в симуляторах BB может быть проблематичной.Я склонен избегать этого сам.Возможно, вам придется запустить «Симулятор MDS».

0 голосов
/ 15 февраля 2012

Привет, вы просто добавили расширение сети, вы можете получить ответ

если вы хотите запустить приложение в devise, вы можете добавить расширение сети как ";deviceside=true"

означает, что в вашем коде просто изменить

StreamConnection s = (StreamConnection)Connector.open(url+;deviceside=true);

тогда вы можете увидеть ответ

для более подробной информации о расширении сети, пожалуйста, проверьте следующую ссылку

https://stackoverflow.com/a/8515091/914111

...