黑莓应用程序无法在模拟器中打开



每个人。我是新来的,这是我的第一篇帖子。我正在创建一个简单的应用程序来获取网络内容。下面是我的代码。问题是,我无法在模拟器上运行这个。没有错误,没有对话框,只是完全无法打开。如果有人能帮我…

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);
}
}

关于您发布的代码的两条注释:

  1. 网络操作(更准确地说,我认为所有非UI操作)应该在单独的工作线程中完成,而不是在主事件线程中(在UIApplication的情况下是UI线程)
  2. 如果需要从UI线程外部访问UI,则可以使用ApplicationinvokeLater()invokeAndWait()方法。或者,工作线程可以在事件锁(由Application.getEventLock()返回)上同步,以确保对UI的序列化访问。请注意,您应该只持有此锁很短的一段时间

至于BlackBerry模拟器和HTTP-为了测试使用HTTP连接的BlackBerry应用程序,必须使用BlackBerry MDS(移动数据系统)连接服务。这是相关指南的链接。

当您启动BlackBerry Smartphone Simulator 时,启动BlackBerry-MDS连接服务

  1. 在Eclipse®中的"运行"菜单上,单击"调试配置"或"运行配置"
  2. 展开BlackBerry Simulator项目
  3. 完成以下任务之一:
    • 要使用现有的启动配置,请在BlackBerry Simulator下单击启动配置
    • 要创建新的启动配置,请右键单击BlackBerry Simulator,然后选择new
  4. 单击模拟器选项卡
  5. 单击"常规"选项卡
  6. 选中Launch Mobile Data System Connection Service(MDS-CS)with simulator复选框
  7. 单击"应用"

我还强烈建议您检查下载的JRE附带的HTTPDemo示例(如果能够编译代码,则至少安装了一个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);
    }
}

嗨,您只需添加网络扩展,就可以获得响应

假设你想在design中运行你的应用程序,你可以添加网络扩展为";deviceside=true"

意味着在你的代码中只需更改

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

然后你可以看到的响应

有关更多网络扩展概念,请验证以下链接

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

如果图标在那里,很可能是应用程序的.cod部署在模拟器中。我会更改你的应用程序,在窗口中显示一个静态标签;这会让你知道应用程序实际上正在运行。

一般来说,BB模拟器中的网络可能很麻烦。我倾向于自己回避。您可能需要运行"MDS模拟器"。

相关内容

  • 没有找到相关文章

最新更新