안녕하세요?
AsyncTask와 HttpURLConnection을 이용하여 파일링크(url)를 참조해
파일을 다운로드받는 기능을 구현하고 있습니다.
현재 파일을 받는 것은 성공했는데, 각종 예외처리 때문에.. 조언 좀 구하려고 합니다.
지금 제일 궁금한게 인터넷 연결이 끊겼을때인데요,
저는 두 가지의 상황을 고려했습니다.
1)공기계 등으로 wifi만 사용한 기기
2)개통된 단말기로 wifi<->3g,lte등 호환.
다른 앱들을 보면, 예를 들어 게임앱에서 파일을 다운로드 받을 때
도중에 wifi신호등이 끊기거나 불안정하면 waiting..등의 다이얼로그가 뜨는데요.
그 상태에서 보통 10~20초동안 도저히 응답처리가 되지 않으면 앱을 종료시키는 경우도 있고,
인터넷 상태를 확인해달라고 다이얼로그 등으로 알려주더군요.
혹은 wifi가 끊기면 대부분 기기가 3g등으로 전환될 때 다운로드 이어받기를 사용자 동의없이 계속 진행하더라고요..
제가 고려/적응하고 싶은 사항은 다음과 같습니다.
1.현재는 공기계[wifi만 되는]로 테스트 중인데 다운로드 도중 인위적으로 wifi를 끄면
바로 다운받기를 종료합니다.[프로그레스 바 등, task 종료];
이부분이 헷갈리는데, setReadTimeout(3000)을 사용하면 read하는데에 응답없는 시간이 3초 이상이면
익셉션이 발생하는 것 아닌가요? 와이파이를 끄자마자 바로 에러가 발생합니다.
인터넷접속이 원할하지 않을 때 발생하는 익셉션이 SocketException인데 맞는지요?
2.위와 같이 인터넷이 불안정할 때 바로 다운로드종료하지 않고 다시 인터넷이 연결될 때
이어받기를 하고 싶습니다. 가능한지요?
3.통신상태를 고려할 때 다른 예외처리도 알려주시면 감사하겠습니다 (__)
아래는 제가 작성한 asynctask일부입니다..doinbackground에서 처리하는 내용입니다.
conn = (HttpURLConnection) NewUrl.openConnection();
conn.setRequestProperty("Accept-Encoding", "identity");// add
conn.setConnectTimeout(3000);// 서버 접속 시 연결 시간.
conn.setReadTimeout(3000);// READ 시 연결 시간.
byte[] data = new byte[1024];// lenth
int read;
long total = 0;
int progress = 0;
InputStream is = conn.getInputStream();
[중간생략..파일 저장하는 로직]
is.close();
fosFile.close();
conn.disconnect();
}
catch (SocketException e)
{
Log.e("socektException","socektException");
suc=10;
}
return suc;
=>반환된 값을 가지고 onPostExecute에서 처리.
1일 경우 성공알리고 종료, 10일경우 인터넷?문제로 실패처리알리고 종료.