WEB_APP/Android

Udacity 강좌 - Lesson 2 실습 02

솔웅 2016. 8. 16. 10:51
반응형

오늘은 지난번에 분석했던 네트워크 연결 관련 소스코드를 실제로 프로젝트에 집어 넣겠습니다.


우선 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 클래스를 만든다.

이렇게 하면 되는데요.

이 과정은 다음 글에서 코드를 분석한 후에 실습을 이어 나가겠습니다.


반응형