Java Blackberry Http连接在图像下载时超时。为什么?
我的应用程序在大约200个URL中循环,这些URL都是jpg图像。 在模拟器中,它读取ok,然后将字节数组毫无问题地存储在persistentStore中。 在设备上,它给出java.io.IOException:TCP读取基本上在每个图像上都超时。 时不时有人能通过。甚至不知道怎么做。图像大小也无法提供洞察力。有些是6k,有些是11k。大小似乎与超时无关。Java Blackberry Http连接在图像下载时超时。为什么?,java,blackberry,device,ioexception,Java,Blackberry,Device,Ioexception,我的应用程序在大约200个URL中循环,这些URL都是jpg图像。 在模拟器中,它读取ok,然后将字节数组毫无问题地存储在persistentStore中。 在设备上,它给出java.io.IOException:TCP读取基本上在每个图像上都超时。 时不时有人能通过。甚至不知道怎么做。图像大小也无法提供洞察力。有些是6k,有些是11k。大小似乎与超时无关。 我将尝试发布我认为相关的代码,但我不是这里的专家,所以如果我遗漏了什么,请说出来。 通过循环和连接线程调用http连接: for(in
我将尝试发布我认为相关的代码,但我不是这里的专家,所以如果我遗漏了什么,请说出来。
通过循环和连接线程调用http连接:
for(int i = 0; i < images.size(); i ++)
{
try {
String url = images.elementAt(i).toString();
HttpRequest data3 = new HttpRequest(url, "GET", false);
data3.start();
data3.join();
} catch (IOException e) {
Dialog.inform("wtf " + e);
}
}
最后,读取流并将字节写入字节数组:
else if(contentType.equals("image/png") || contentType.equals("image/jpeg") || contentType.equals("image/gif"))
{
try
{
if((int) length < 1)
length = 15000;
byte[] responseData = new byte[(int) length];
int offset = 0;
int numRead = 0;
StringBuffer rawResponse = new StringBuffer();
int chunk = responseData.length-offset;
if(chunk < 1)
chunk = 1024;
while (offset < length && (numRead=result.read(responseData, offset, chunk)) >= 0){
rawResponse.append(new String(responseData, offset, numRead));
offset += numRead;
}
String resultString = rawResponse.toString();
byte[] dataArray = resultString.getBytes();
result.close();
database db = new database();
db.storeImage(venue_id, dataArray);
}
catch( Exception e )
{
System.out.println(">>>>>>>----------------> total image fail: " + e);
}
}
else if(contentType.equals(“image/png”)| | contentType.equals(“image/jpeg”)| | contentType.equals(“image/gif”))
{
尝试
{
如果((int)长度小于1)
长度=15000;
字节[]响应数据=新字节[(int)长度];
整数偏移=0;
int numRead=0;
StringBuffer rawResponse=新的StringBuffer();
int chunk=responseData.length-offset;
if(块<1)
区块=1024;
而(偏移量=0){
append(新字符串(responseData、offset、numRead));
偏移量+=numRead;
}
字符串resultString=rawResponse.toString();
byte[]dataArray=resultString.getBytes();
result.close();
数据库db=新数据库();
db.storeImage(场馆标识、数据阵列);
}
捕获(例外e)
{
System.out.println(“>>>>>-->total image fail:”+e);
}
}
需要考虑的事项:在模拟器中,长度始终是字节长度。在设备中,它始终为-1。
chunk变量是一个测试,看看我是否强制一个15k字节的数组,它是否会像预期的那样读取,因为字节[-1]给出了一个越界异常。结果是一样的。有时它会写。大部分时间都超时了。
非常感谢您的帮助。您可以使用参数“ConnectionTimeout”调整Blackberry上TCP超时的长度 在您的代码中:
HttpConnection connection = (HttpConnection)Connector.open(url + updateConnectionSuffix());
您需要附加ConnectionTimeout。您可以将其写入updateConnectionSuffix()中,也可以将其追加
HttpConnection connection = (HttpConnection)Connector.open(url + updateConnectionSuffix() + ";ConnectionTimeout=54321");
这将超时设置为54321毫秒
当客户端等待服务器发送ack,但在指定的时间内没有收到ack时,会发生超时
编辑:还有,你能使用浏览器吗?您可能还想使用deviceside参数。您可以使用参数“ConnectionTimeout”调整Blackberry上TCP超时的长度 在您的代码中:
HttpConnection connection = (HttpConnection)Connector.open(url + updateConnectionSuffix());
您需要附加ConnectionTimeout。您可以将其写入updateConnectionSuffix()中,也可以将其追加
HttpConnection connection = (HttpConnection)Connector.open(url + updateConnectionSuffix() + ";ConnectionTimeout=54321");
这将超时设置为54321毫秒
当客户端等待服务器发送ack,但在指定的时间内没有收到ack时,会发生超时
编辑:还有,你能使用浏览器吗?您可能还想使用deviceside参数。我认为问题可能是您在从输入流读取字节之前关闭了连接。请尝试在读取字节后移动连接。close()。我认为问题可能是您在从输入流读取字节之前关闭了连接。请尝试移动连接。请在读取字节后关闭()。谢谢!我应用了这两种解决方案,该应用程序正在下载和存储图像,正如预期的那样。如果我有时间进行进一步的调试,我可以精确地指出是哪一个解决了这个问题,并将其归功于最能解决这个问题的那个,这样未来的程序员就可以从中准确地受益;谢谢你!我应用了这两种解决方案,该应用程序正在下载和存储图像,正如预期的那样。如果我有时间进行进一步的调试,我可以精确地指出是哪一个解决了这个问题,并将其归功于最能解决这个问题的那个,这样未来的程序员就可以从中准确地受益;D