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

これは 1 年前の質問に対する新しい回答ですが、コードに同様の問題があり、解決できました。

この行が問題です:

is = url.openStream();

入力ストリームを取得する正しい方法は、url オブジェクトではなく接続オブジェクトから入力ストリームを取得することです。

is = con.getInputStream();

前者のアプローチは、呼び出しによって取得された接続オブジェクトとは別の別のネットワーク接続を開く可能性がありますurl.openConnection()

この Web ブログ ページを評価することで、これらすべてを把握しました。

また、同様の問題を抱えている他の人にとっては、接続オブジェクトでgetInputStreamorメソッドを呼び出す前に、 setReadTimout を早期に呼び出すことも非常に重要です。connect

于 2014-08-09T08:20:11.250 に答える
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

このようにしてみて、

HttpURLConnection uc = (HttpURLConnection) u.openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(myProxyHost, Integer.parseInt(myProxyPort))));
于 2013-09-11T04:58:42.163 に答える