Xml 从服务器下载文件
在这里,我试图将一个文件从服务器下载到SD卡上。代码如下所示:Xml 从服务器下载文件,xml,http,blackberry,download,Xml,Http,Blackberry,Download,在这里,我试图将一个文件从服务器下载到SD卡上。代码如下所示: try{ FileConnection fconn = (FileConnection)Connector.open("file:///SDCard/BlackBerry/documents/Report.xml"); if (fconn.exists()) { fconn.delete(); } fconn.create(); add(new RichTextField("Deleted
try{
FileConnection fconn = (FileConnection)Connector.open("file:///SDCard/BlackBerry/documents/Report.xml");
if (fconn.exists()) {
fconn.delete();
}
fconn.create();
add(new RichTextField("Deleted and created", Field.NON_FOCUSABLE));
HttpConnection connection = (HttpConnection)
Connector.open("http://127.0.0.1/xml/home.xml");
add(new RichTextField("Connection success", Field.NON_FOCUSABLE));
InputStream ds = connection.openInputStream();
byte[] data = new byte[ds.available()];
ds.read(data);
add(new RichTextField("Data read", Field.NON_FOCUSABLE));
OutputStream outStream = fconn.openOutputStream();
outStream.write(data);
outStream.close();
add(new RichTextField("Data written succesfully", Field.NON_FOCUSABLE));
fconn.close();
}
catch (Exception e) {
// TODO: handle exception
}
问题是,在emulatora上,我看到前两条消息,即
- 删除并创建
- 连接成功
请帮我解决这个问题好吗?我的代码中有问题吗?还是有其他问题?首先,这一行:
add(new RichTextField("Deleted and created", Field.NON_FOCUSABLE));
HttpConnection connection = (HttpConnection) Connector.open("http://127.0.0.1/xml/home.xml");
让我觉得你是在事件线程上直接这么做的,这是一种糟糕的做法。如果连接超时或需要很长时间,那么此时您将冻结GUI。您通常会生成一个工作线程来执行这样的长任务
也就是说,您的代码可以工作,但并不真正健壮。很多事情都会变坏。例如,这一行:
add(new RichTextField("Deleted and created", Field.NON_FOCUSABLE));
HttpConnection connection = (HttpConnection) Connector.open("http://127.0.0.1/xml/home.xml");
返回的连接可以为null,因此必须检查它。您最好使用ConnectionFactory
,因为它为每种连接(WiFi、BES、TCP等)添加了正确的后缀。在模拟器中,我不确定您是否可以使用localhost URL,因为它是您工作站的本地URL,但模拟的BB设备必须经过MDS模拟器
使用FileConnection
时,还必须检查它是否不为null,以及fconn.canRead
是否返回true。考虑到并非每个设备都有SD卡插槽(最近的设备有)。您可以按照中的说明检查卡是否可用,或者让捕获
处理异常。若你们在模拟器上测试,你们必须“挂载”一个虚拟SD卡
此外,本电话:
ds.read(data);
将一直阻止,直到服务器实际向您发送内容为止。这可能就是正在发生的事情
您必须检查您是否具有正确的权限。对于文件连接,您需要:
ApplicationPermissions.PERMISSION_FILE_API
对于网络连接,根据您连接到的位置,您需要:
ApplicationPermissions.PERMISSION_INTERNET
ApplicationPermissions.PERMISSION_SERVER_NETWORK
最后一个提示:在try-catch中添加一个finally子句,并关闭finally中的所有流和连接(如果它们不为null)。HTTP连接仅在
InputStream ds=connection.openInputStream()行上尝试代码>失败,因此在此之后您不会看到任何消息。失败的原因可能是模拟器无法访问指定的URL
在线路连接器上。打开(“http://127.0.0.1/xml/home.xml");代码>尝试将URL更改为http://127.0.0.1/xml/home.xml?interface=wifi
这将迫使模拟器使用模拟的WLAN连接,该连接实际上是您电脑的网络接口。确保模拟器已连接到默认WLAN连接
此外,与其向屏幕添加UI字段以查看代码中发生了什么,不如添加调试消息(例如,System.out.println(“Got connection”)
)并使用调试器,只需在eclipse中按F11即可。谢谢您的早日回复。我已经测试了所有的空值,我的连接也成功了,但问题在于输入流对象的创建。所以请给我一个输入流的解决方案,以及如何使用上面提到的所有权限。inputstream行是第一个真正建立HTTP连接的行。也许你有一个暂停。您应该让它运行至少3分钟,并记录异常。然后请发布。关于权限,我认为模拟器中不需要这些权限。在实际设备中,用户在安装时设置权限(或稍后通过“选项”菜单设置权限)。您是否发现问题所在?是的,首先是连接超时,而且我的防病毒软件(ESET)阻止了防火墙,这使我的工作更糟。。谢谢你的帮助,史密斯先生