마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

AsyncTask 예외처리 질문 드립니다..

0 추천

안녕하세요?

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일경우 인터넷?문제로 실패처리알리고 종료.

 

망고사탕 (5,000 포인트) 님이 2017년 8월 17일 질문

1개의 답변

0 추천
 
채택된 답변
1. 예외(연결이 종류가 되니..)가 발생하는게 맞습니다. ReadTimeout은 connection read시의 duration을 말합니다. 그리고 인터넷이 원활하지 않을때라는 상태는 클라이언트 측(안드로이드)에서 확인하기 어려울 거라 생각합니다. 예로 wifi는 붙었는데 인터넷은 안되는 상태이거나 붙었지만 신호가 약해서 실제로는 인터넷이 안되는 상태등의 예외상황이 많습니다.

그리고, 10초뒤 등의 처리는 Timer를 사용하시면 처리할 수 있겠습니다.

2. 가능합니다. 웹 서버의 rage 헤더를 사용해서 바이너리를 범위로 받아오시면 될것 같네요.

3. 1번에 적어 봤습니다.

그리고, 제가 개발한 라이브러리가 있는데 이것도 참고해 보세요.. https://github.com/mcsong/AdvancedAsyncTask
mcsong (44,040 포인트) 님이 2017년 8월 18일 답변
망고사탕님이 2017년 8월 18일 채택됨
답변 감사드립니다..^^
일단은 이어받기부터 진행해보고 라이브러리도 참고하겠습니다.
좋은하루보내세요.
...