4

我正在开发一个需要从服务器下载数据的应用程序。
我使用以下代码,除了它有时会在文件下载过程中卡住之外,它可以工作。

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 没有效果?

4

4 回答 4

3

这是对老问题的新答案,但我的代码中有一个类似的问题,我已经能够解决。

这条线是问题所在:

is = url.openStream();

获取输入流的正确方法是简单地从连接对象而不是 url 对象获取输入流。

is = con.getInputStream();

前一种方法可能会打开另一个网络连接,与通过调用获得的连接对象分开url.openConnection()

通过评估这个网络博客页面,我发现了这一切。

对于其他有类似问题的人来说,尽早调用 setReadTimout 也非常重要——在调用连接对象的getInputStreamor方法之前。connect

于 2014-08-09T08:20:11.250 回答
0

像这样试试

HttpURLConnection uc = (HttpURLConnection) u.openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(myProxyHost, Integer.parseInt(myProxyPort))));
于 2013-09-11T04:58:42.163 回答
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
    }
});
于 2013-09-11T04:48:10.903 回答
0
HttpPost httpPostRequest = new HttpPost(URL); 
httpPostRequest.getParams().setParameter("http.socket.timeout", new Integer(600000));

请检查此代码。它在我的应用程序中工作。

于 2013-09-11T05:10:57.660 回答