我在后台应用程序上实现了计时器任务。
我收集了当前的lat和long。并且每30秒发送到服务器。
我使用下面的代码将信息发送到服务器。它发送成功..
我的问题是,在我检查了10分钟后,我无法发送。它会抛出No Network错误。我也检查过浏览器,但没有网络。
如果重置设备,它再次正常工作。但是在5或10分钟后会出现同样的问题。
如何解决这个问题?
我的代码是,
try
{
StreamConnection connection = (StreamConnection) Connector.open(url+suffix);
((HttpConnection) connection).setRequestMethod(HttpConnection.GET);
int responseCode = ((HttpConnection) connection).getResponseCode();
if (responseCode != HttpConnection.HTTP_OK) {
showDialog("Unexpected response code :"+ responseCode);
connection.close();
return;
}
((HttpConnection) connection).getHeaderField("Content-type");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream responseData = connection.openInputStream();
byte[] buffer = new byte[1000];
int bytesRead = responseData.read(buffer);
while (bytesRead > 0) {
baos.write(buffer, 0, bytesRead);
bytesRead = responseData.read(buffer);
}
baos.close();
connection.close();
String s = new String(baos.toByteArray());
showDialog("Responce from server "+s);
}
catch (IOException e)
{
}
答案 0 :(得分:1)
通常情况下,如果你遇到一些问题,它会工作几次,然后停止工作,而你需要重置设备,那么你已经做了一些耗尽了所有可用资源的事情,而没有在你发布时释放它们完成。
执行重复的网络操作时,应在每次使用后清理流和连接。
通常,编写网络代码的正确方法是在try
块之外声明网络变量,在try
内分配和使用它们,同时捕获任何IOExceptions
抛出的内容。然后,无论代码是否成功完成,您都可以使用finally
块来清理资源。
我还会注意到,当调试网络问题时,您不希望拥有一个catch()
处理程序,它只是捕获异常并且不对它们执行任何操作。将消息打印到控制台(用于测试)或将错误记录到文件中。
最后,我看不到您的showDialog()
方法,但如果它向用户/测试人员显示UI,则需要在UI线程上执行此操作。但是,您在上面显示的网络代码应该在后台线程上运行,以保持UI响应。因此,在showDialog()
内,只需确保使用代码修改UI线程上的UI。
因此,更好的实现可能是这样的:
private void requestFromServer() {
StreamConnection connection = null;
ByteArrayOutputStream baos = null;
InputStream responseData = null;
try
{
connection = (StreamConnection) Connector.open(url+suffix);
((HttpConnection) connection).setRequestMethod(HttpConnection.GET);
int responseCode = ((HttpConnection) connection).getResponseCode();
if (responseCode != HttpConnection.HTTP_OK) {
showDialog("Unexpected response code :"+ responseCode);
return;
}
((HttpConnection) connection).getHeaderField("Content-type");
baos = new ByteArrayOutputStream();
responseData = connection.openInputStream();
byte[] buffer = new byte[1000];
int bytesRead = responseData.read(buffer);
while (bytesRead > 0) {
baos.write(buffer, 0, bytesRead);
bytesRead = responseData.read(buffer);
}
String s = new String(baos.toByteArray());
showDialog("Responce from server "+s);
}
catch (IOException e)
{
System.out.println("Network error: " + e.getMessage());
}
finally
{
try {
if (connection != null) {
connection.close();
}
if (baos != null) {
baos.close();
}
if (responseData != null) {
responseData.close();
}
} catch (IOException e) {
// nothing to do here
}
}
}
private void showDialog(final String msg) {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
Dialog.alert(msg);
}
});
}