2011-07-26 28 views
35

HTTPUrlConnectionを使用して簡単なRSSフィードに接続しています。それは完全に動作します。接続にタイムアウトを追加したいのですが、接続が悪い場合などにアプリケーションがぶら下がりしないようにするためです。これは私が使用するコードであり、setConnectTimeoutメソッドは何の効果もありません。HttpURLConnection setConnectTimeout()は効果がありません

 HttpURLConnection http = (HttpURLConnection) mURL.openConnection(); 
     http.setConnectTimeout(15000); //timeout after 15 seconds 
... 

もし私がアンドロイドで開発しているなら、助けてください。

+1

2つのことのためにIPSを確認することができます。あなたのアプリがハングしないようにするには、接続メソッドを別のスレッドに入れます。第二に、あなたはそれが完全に "働いた"と言った、悪い接続をシミュレートするためにあなたは何をしていますか? – Otra

+0

@Otra私はprogressdialogを使って別のスレッドでそれを持っています。基本的に何が起こるかは、接続が良好であれば、タスクはそのことを行います。しかし、接続が悪い場合、進歩ダイアグラムは長年にわたって維持されます。悪い接続をシミュレートするために、私はタイムアウト時間を短縮しています。代わりに15秒、1秒を与える。テスト用です。それとも間違っている? –

+3

HttpURLConnection.setReadTimeout(ミリ秒); –

答えて

16

あなたはおそらくどちらか/両方:
1)は&が例外を扱うキャッチしないでください接続
2)から何かを読んではいけないが、適切

としてはhere、に似て使用ロジック言及しましたこれは:

int TIMEOUT_VALUE = 1000; 
try { 
    URL testUrl = new URL("http://google.com"); 
    StringBuilder answer = new StringBuilder(100000); 

    long start = System.nanoTime(); 

    URLConnection testConnection = testUrl.openConnection(); 
    testConnection.setConnectTimeout(TIMEOUT_VALUE); 
    testConnection.setReadTimeout(TIMEOUT_VALUE); 
    BufferedReader in = new BufferedReader(new InputStreamReader(testConnection.getInputStream())); 
    String inputLine; 

    while ((inputLine = in.readLine()) != null) { 
     answer.append(inputLine); 
     answer.append("\n"); 
    } 
    in.close(); 

    long elapsed = System.nanoTime() - start; 
    System.out.println("Elapsed (ms): " + elapsed/1000000); 
    System.out.println("Answer:"); 
    System.out.println(answer); 
} catch (SocketTimeoutException e) { 
    System.out.println("More than " + TIMEOUT_VALUE + " elapsed."); 
} 
52

また、(http.setReadTimeout())の読み取りタイムアウトを設定しようとする必要があります。多くの場合、Webサーバーは幸いにあなたの接続を受け入れますが、要求に実際に応答するのは遅いかもしれません。

+0

これは私のために働いた。 – stevehs17

+1

ルータに接続していてインターネット接続が切断されていると、私のために機能しませんでした。 –

-1

接続を開く前にConnectionTimeoutを設定してください。

+2

どのように - コンストラクタは保護されたメソッドですか? – SK9

6

私も同様の問題がありました。これは、HttpUrlConnection won't time out中ダウンロードです。たとえば、ダウンロードを行っているときにWi-Fiをオフにすると、私は同じ割合で停止してダウンロードを続けています。

DownloaderTaskという名前のAsyncTaskに接続されたTimerTaskを使用して解決策を見つけました。試してみてください。そして、実際のダウンロードループでタイムアウトエラーのタイマー設定

class Timeout extends TimerTask { 
    private DownloaderTask _task; 

    public Timeout(DownloaderTask task) { 
     _task = task; 
    } 

    @Override 
    public void run() { 
     Log.w(TAG,"Timed out while downloading."); 
     _task.cancel(false); 
    } 
}; 

    _outFile.createNewFile(); 
        FileOutputStream file = new FileOutputStream(_outFile); 
        out = new BufferedOutputStream(file); 
        byte[] data = new byte[1024]; 
        int count; 
        _timer = new Timer(); 
        // Read in chunks, much more efficient than byte by byte, lower cpu usage. 
        while((count = in.read(data, 0, 1024)) != -1 && !isCancelled()) { 
         out.write(data,0,count); 
         downloaded+=count; 
         publishProgress((int) ((downloaded/ (float)contentLength)*100)); 
         _timer.cancel(); 
         _timer = new Timer(); 
         _timer.schedule(new Timeout(this), 1000*20); 
        } 
        _timer.cancel(); 
        out.flush(); 

それならばタイムアウトにして、20秒でさえ1Kダウンロードされませんが、それは代わりのキャンセル永遠にダウンロードされているように見える。

+0

進行中の接続とダウンロードを防ぐための良いアイデア:) –

2

私は同じ問題に直面していました。 connectionTimeoutreadTimeoutを設定しても、予期したとおりに例外が返されるとは思われませんが、実際にはそうです。 URLConnection()メソッドをチェックして、何が起こっているのか理解している間、私にかかった。 setConnectTimeoutのドキュメントでは、ホスト名が複数のIPアドレスに解決された場合、このクライアントはそれぞれに試行されますが、接続試行が例外をスローする前に複数のタイムアウトが経過すると、警告

"が表示されます。 " これは、あなたのホストによって10 ipsが解決された場合、実際のタイムアウトは "10 * readTimeoutSet"となります。

あなたは、ホスト名ご検討のためのhere

1
http.setConnectTimeout(15000); 
http.setReadTimeout(15000); 
関連する問題