每个人。我是新来的,这是我的第一篇帖子。我正在创建一个简单的应用程序来获取网络内容。下面是我的代码。问题是,我无法在模拟器上运行这个。没有错误,没有对话框,只是完全无法打开。如果有人能帮我…
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);
}
}
关于您发布的代码的两条注释:
- 网络操作(更准确地说,我认为所有非UI操作)应该在单独的工作线程中完成,而不是在主事件线程中(在
UIApplication
的情况下是UI线程) - 如果需要从UI线程外部访问UI,则可以使用
Application
的invokeLater()
或invokeAndWait()
方法。或者,工作线程可以在事件锁(由Application.getEventLock()
返回)上同步,以确保对UI的序列化访问。请注意,您应该只持有此锁很短的一段时间
至于BlackBerry模拟器和HTTP-为了测试使用HTTP连接的BlackBerry应用程序,必须使用BlackBerry MDS(移动数据系统)连接服务。这是相关指南的链接。
当您启动BlackBerry Smartphone Simulator 时,启动BlackBerry-MDS连接服务
- 在Eclipse®中的"运行"菜单上,单击"调试配置"或"运行配置"
- 展开BlackBerry Simulator项目
- 完成以下任务之一:
- 要使用现有的启动配置,请在BlackBerry Simulator下单击启动配置
- 要创建新的启动配置,请右键单击BlackBerry Simulator,然后选择new
- 单击模拟器选项卡
- 单击"常规"选项卡
- 选中Launch Mobile Data System Connection Service(MDS-CS)with simulator复选框
- 单击"应用"
我还强烈建议您检查下载的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模拟器"。