오늘은 지난번에 분석했던 네트워크 연결 관련 소스코드를 실제로 프로젝트에 집어 넣겠습니다.
우선 https://gist.github.com/anonymous/1c04bf2423579e9d2dcd 에 있는 소스코드를 MainActivity 의 PlaceholderFragment class에 있는 onCreateView Method 에 삽입합니다.
이 때 몇가지 import 해야 하는데요. 이건 Auto Import를 활성화 해 놓으면 이클립스가 알아서 처리합니다.
Mac instructions: To enable auto-import, go to Android Studio > Preferences > Editor > Auto Import. Check all the boxes and insert all imports on paste.
Windows instructions: To enable auto-import, go to File > Settings > Editor > Auto Import > Java. Check all the boxes and insert all imports on paste.
이렇게 한 다음에 실행 하면 NetworkOnMainThreadException 이 일어납니다.
Android Device Monitor 에서 프로세스 아이디 (여기서는 7762)로 LOGCAT을 검색해 보면 위 그림과 같이 NetworkOnMainThreadException 이 일어났다는 메세지가 나오고 어느 클래스의 몇번째 줄에 있는 코드에서 예외가 발생했다는 로그들을 찾아 볼 수 있습니다.
저 로그를 보면 에러는 115번째 줄에서 난 것으로 나옵니다.
바로 urlConnection.connect(); 부분 입니다.
그 이유는 이 연결은 Main Thread 에서는 구현하면 안되는 것이기 때문입니다.
그럼 이제 이 소스코드를 올바르게 Refactoring 해야 하는데요. 일단 그 전에 프로세스와 쓰레드에 대해 간단히 공부하고 넘어가겠습니다.
메인 쓰레드에서는 대개 사용자와 상호 작용하는 UI 관련 작업들을 담당하게 됩니다.
백그라운드 쓰레드에서는 long-running work 을 주로 담당하게 됩니다.
Background Thread 를 생성하려면 AsyncTask 를 사용하면 간단하게 처리할 수 있습니다.
이 클래스의 핵심 메소드는 doInBackground() 입니다.
이 글 쓰기 전에 프로세스와 쓰레드에 대해 두어개의 글을 올렸는데 그것도 도움이 될 겁니다.
이제 네트워크 관련 소스코드들을 AsyncTask 로 옮겨 보겠습니다.
옮기는 순서는
1. PlaceholderFragment class 를 ForecastFragment class 로 이름을 바꾼다
2. ForecastFragment 라는 새로운 자바 파일을 만들어서 이 클래스를 옮긴다.
3. FetchWeatherTask 라는 이름의 AsyncTask 클래스를 만든다.
이렇게 하면 되는데요.
이 과정은 다음 글에서 코드를 분석한 후에 실습을 이어 나가겠습니다.
'WEB_APP > Android' 카테고리의 다른 글
Android Toast 정리 (0) | 2016.09.07 |
---|---|
Udacity 강좌 - Lesson 2 소스 실행 순서 따라가기 (0) | 2016.09.06 |
Udacity 강좌 - Lesson 2 실습 05 (2) | 2016.08.29 |
Udacity 강좌 - Lesson 2 실습 04 - 2과 완성 코드 실행 - (0) | 2016.08.23 |
Udacity 강좌 - Lesson 2 실습 03 (0) | 2016.08.17 |
Android Network Connection (0) | 2016.08.11 |
Udacity 강좌 - Lesson 2 실습 01 (0) | 2016.08.10 |
Udacity 강좌 - Developing Android Apps Lesson 2 Summary (0) | 2016.08.09 |
Udacity 강좌 - Lesson 1 실습 (0) | 2016.08.08 |
Udacity 강좌 - Developing Android Apps Lesson 1 Summary (1) | 2016.07.22 |