我正在开发一个需要从服务器下载数据的应用程序 我使用下面的代码,除了有时在文件下载时卡住了。
try{
URL url = new URL( dlUrl );
con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(1000); // timeout 1 sec
con.setReadTimeout(1000); // timeout 1 sec
// get file length
int lenghtOfFile = con.getContentLength();
is = url.openStream();
String dir = Environment.getExternalStorageDirectory() + "myvideos";
File file = new File( dir );
if( !file.exists() ){
if( file.mkdir()){
// directory succesfully created
}
}
fos = new FileOutputStream(file + "/" + "video.mp4");
byte data[] = new byte[1024];
long total = 0;
while( (count = is.read(data)) != -1 ){
total += count;
publishProgress((int)((total*100)/lenghtOfFile));
fos.write(data, 0, count);
}
} catch (Exception e) {
Log.e(TAG, "DOWNLOAD ERROR = " + e.toString() );
}
finally{
// close streams
}
问题可能是我使用的WIFI连接不稳定,或者我的代码遗漏了什么
现在我想在下载停止时添加一个解决方法,但不幸的是setReadTimeout
似乎没有效果!
我尝试了Stackoverflow中建议的解决方案,但没有人为我做过这个工作
我错过了某种设置吗?
有什么想法为什么setReadTimeout没有效果?
答案 0 :(得分:3)
对于一年之久的问题,这是一个新的答案,但我的代码中有一个类似的问题,我已经能够解决。
这一行是问题所在:
is = url.openStream();
获取输入流的正确方法是简单地从连接对象获取输入流而不是url对象。
is = con.getInputStream();
前一种方法可能会通过调用url.openConnection()
我通过评估this web blog page来解决所有问题。
对于有类似问题的其他人来说,在调用连接对象上的getInputStream
或connect
方法之前,提前调用setReadTimout也非常重要。
答案 1 :(得分:0)
也许是一些警察,但您可能会考虑使用http://loopj.com/android-async-http/之类的网络库。我发现它有助于减轻很多繁琐的网络调试,例如你所描述的内容。
以下是该网站的示例:
AsyncHttpClient client = new AsyncHttpClient();
String[] allowedContentTypes = new String[] { "image/png", "image/jpeg" };
client.get("http://example.com/file.png", new BinaryHttpResponseHandler(allowedContentTypes) {
@Override
public void onSuccess(byte[] fileData) {
// Do something with the file
}
});
答案 2 :(得分:0)
试试这个,
HttpURLConnection uc = (HttpURLConnection) u.openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(myProxyHost, Integer.parseInt(myProxyPort))));
答案 3 :(得分:0)
HttpPost httpPostRequest = new HttpPost(URL);
httpPostRequest.getParams().setParameter("http.socket.timeout", new Integer(600000));
请检查此代码。在我的应用中工作。