Android-HttpURLConnection setReadTimeout无法正常工作

我正在开发一个需要从服务器下载数据的应用程序.
我使用以下代码,除了有时在文件下载过程中被卡住之外,该代码行得通.

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似乎没有效果!
我尝试了*中建议的解决方案,但没有一项对我有用.
我是否缺少某种设置?
有什么想法为什么setReadTimeout没有效果?

解决方法:

这是对已有多年历史的问题的新解答,但我的代码中有一个类似的问题可以解决.

这行是问题所在:

is = url.openStream();

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

is = con.getInputStream();

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

我通过评估this web blog page找出了所有这些.

对于其他存在类似问题的人,在调用getInputStream或连接对象的connect方法之前,尽早调用setReadTimout也很重要.

上一篇:Java-邮件标题值中的非法字符:基本


下一篇:Android Https状态码-1