2011-07-26 4 views
35

HTTPUrlConnection을 사용하여 간단한 RSS 피드에 연결하고 있습니다. 그것은 완벽하게 작동합니다. 연결에 시간 초과를 추가하고 싶습니다. 잘못된 연결이나 다른 상황이 발생했을 때 내 응용 프로그램이 멈추기를 원하지 않기 때문입니다. 이것은 내가 사용하는 코드이며 setConnectTimeout 메서드는 아무런 효과가 없습니다.HttpURLConnection setConnectTimeout()은 효과가 없습니다.

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

내가 안드로이드로 개발하는 데 도움이된다면.

+1

두 가지에 대한 IP를 확인할 수 있습니다. 앱이 멈추지 않게하려면 연결 방법을 별도의 스레드에 넣으십시오. 둘째, 완벽하게 작동한다고 말했습니까? 연결 상태를 잘못 시뮬레이트하기 위해 무엇을하고 있습니까? – 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())도 설정해야합니다. 종종 웹 서버가 행복하게 연결을 수락하지만 실제로 요청에 응답하는 속도가 느릴 수 있습니다.

+0

이것은 저에게 효과적이었습니다. – stevehs17

+1

라우터에 연결되어 있지만 인터넷 연결이 끊어져 있으면 작동하지 않습니다. –

-1

연결을 열기 전에 ConnectionTimeout을 설정하십시오.

+2

어떻게 생성자가 보호 된 메서드입니까? – SK9

6

비슷한 문제가 발생했습니다. HttpUrlConnection won't time out 중간 다운로드가 있기 때문입니다. 예를 들어, 다운로드가 진행되는 동안 wifi를 끄면 광산에서 다운로드가 계속 진행되고 동일한 비율로 고정됩니다.

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 주소로 해석되면이 클라이언트가 각각 시도 할 것이므로 경고

"이 표시됩니다. 이러한 각 주소에 연결하는 데 실패하면 연결 시도가 예외를 throw하기 전에 여러 시간 초과가 발생합니다. " 호스트에서 10 ips가 해결되면 실제 시간이 초과되어 "10 * readTimeoutSet"이됩니다.

당신은 호스트 이름 당신의 고려 here

1
http.setConnectTimeout(15000); 
http.setReadTimeout(15000); 
관련 문제