반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 받은 트랙백

글 보관함


Udacity - Developing Android Apps Lesson 2 Summary


New Concepts


    HttpURLConnection
    Logcat
    MainThread vs. Background Thread
    AsyncTask
    Adding Menu Buttons
    values/strings.xml
    Permissions
    JSON Parsing

   
* HttpURLConnection

HttpURLConnection 는 자바 클래스로 웹을 통해 데이터를 주고 받을 때 주로 사용합니다. 우리는 이것을 OpenWeatherMap API 로부터 JSON 데이터를 받기 위해 사용합니다. 이 코드가 해야할 일은 이 비디오와 gist 에서 설명하고 있습니다.


* Logcat

Logcat 은 안드로이드 디바이스의 logging output을 사용할 수 있도록 하는 프로그램입니다. 이 코스에서는 3가지 방법을 사용하고 있습니다.

1. 안드로이드 스튜디오에는 DDMS 윈도우가 있는데 여기에 logcat output을 포함하고 있습니다. Android Window가 선택되어 있어야 합니다.



2. 터미널을 열고 adb logcat 을 칩니다. 필요한 output을 얻고자 한다면 developer guide를 보시면 좀 더 자세한 내용들을 보실 수 있습니다.

3. Android DDMS 를 별도의 창에서 열고 logcat 으로 갑니다.



log 들이 5가지로 분류되서 제공됩니다. Verbose, Debug, Info, Warn, Error. log level을 선택함으로서 원하시는 log만 보실 수 있습니다. 예를 들어 warning 이상의 로그들을 선택하면 Warning 과 Error 로그들을 보실 겁니다.

여러분의 코드에 이 logcat 에 보낼 로그를 설정하실 수 있습니다. 사용하시는 방법은 Log 클래스를 사용해서 v,d,i,w,e 메소드들을 활용합니다. 각각의 메소드는 두개의 string을 갖는데요 하나는 어디서 로그가 나오는지 하고 다른 파라미터는 log 메세지 입니다.
tag에 대해 이 코스에서 사용하는 규칙은 해당 상수가 있는 클래스의 이름과 같은 String 상수 LOG_TAG를 생성한다는 겁니다. class 이름을 프로그램에서 얻을 수 있습니다.

private final String LOG_TAG = MainActivity.class.getSimpleName();


* MainThread vs. Background Thread

안드로이드에는 Main Thread 혹은 UI Thread 라는 개념이 있습니다. 쓰레드에 대해 알고 싶으시면 여기 wikipedia article을 보세요. main thread는 UI가 부드럽게 진행되도록 합니다. 그리고 사용자의 input에 반응 하는 것을 담당합니다. 한번에 하나의 task 만 구동할 수 있습니다. Main Thread 에서 아주 오랫동안 프로세스를 시작하면, 예를 들어 아주 복잡한 계산이나 프로세스 로딩 등, 이 프로세스가 끝날 때까지 사용자는 input에 대한 반응을 받지 못할 겁니다.
그래서 긴 프로세스를 시작해야 되면 Background thread를 사용하는 것을 검토 해야 합니다. 그러면 Main Thread를 block 하는 일은 없을 겁니다. 이렇게 하는 방법 중에 AsyncTask 의 subclass를 생성하는 것도 하나의 방법 입니다.


* AsyncTask

AsyncTask는 쉽게 background thread 에서 일을 진행할 수 있도록 하는 안드로이드 클래스 입니다. 이것을 사용하면 Main Thread를 방해하지 않게 됩니다. 이 AsyncTask를 사용하려면 FetchWeatherTask에서 했던 대로 이것을 subclass 화 해야 합니다. 아래는 이를 override 하기 위한 4가지 중요한 부분입니다.

- onPreExecute : 이 메소드는 task 가 시작되기 전에 UI 단에서 실행됩니다. 셋업이라든지 작업이 시작되기 전에 이루어 져야 할 부분들을 이 메소드에서 정의 합니다.
- doInBackground : 이 부분이 바로 main thread를 방해하지 않으면서 작업을 진행 할 수 있도록 하는 부분 입니다. 이 부분에 코드가 작성되면 이는 background thread에서 작동되며 UI 단을 방해하지 않습니다.
- onProgressUpdate : 이것은 UI thread에서 구동되는 메소드 입니다. 주로 해당 작업의 진행상황을 보여줍니다. 예를 들어 loading bar 같은 것을 보여줍니다.
- onPostExecute :  해당 작업이 끝난 후 UI 단에서 실행되는 메소드 입니다.

AsyncTask를 시작할 때 현재 있는 activity에서 이 작업이 이루어 지고 있다는 것을 유념하세요. 그 activity 가 destroy 되면 (예를 들어 핸드폰이 ratate 됐다던가 해서..) 이 AsyncTask 는 새로 활성화 된 Activity 가 아니라 destroy 된 activity를 참고 하게 될 겁니다. 이게 AsyncTask를 사용할 때 위험한 부분 입니다.



* Adding menu buttons

메뉴 버튼을 만들기 위한 기본적인 과정들 입니다.
1. xml 파일을 res/menu 에 추가한다. 여기에는 추가할 버튼들이 정의 된다. 순서, 정렬 같은 속성들도 같이 정의 됩니다.
2. 메뉴 버튼들이 fragment와 연관돼 있다면 그 fragment의 onCreate 메소드 안에서 sethasOptionsMenu(ture) 를 호출해야 합니다.
3. onCreateOptionsMenu 안에서 다음과 같이 inflate 합니다.
inflater.inflate(R.menu.forecastfragment, menu);
4. onOptionsItemSelected 에서 어떤 아이템이 선택 됐는지를 체크하고 거기에 대한 반응을 설정 할 수 있습니다. Refresh 의 경우 FetchWeatherTask를 생성하고 실행하게 될 겁니다.


* values/strings.xml

안드로이드에는 앱의 모든 string을 가지고 있는 파일을 만들 수 있습니다. values/strings.xml이 그 파일인데요. 이렇게 모든 string을 하나의 파일에서 관리하는것이 권장되는 이유는 layout들에서 그 내용들을 관리하는 것 보다는 한 곳에서 관리하는 것이 좀 더 유용하기 때문입니다. values-lanuage/strings.xml을 만들어서 특정 언어에 해당하는 string들을 따로 관리할 수도 있습니다. 예를 들어 앱의 일본어 버전을 만들고 싶으면 values-ja/string.xml을 생성하실 수 있습니다. string에 translatable='false' 가 설정돼 있으면 해당 string은 따로 번역되지 않는다는 의미입니다. 이 기능은 고유명사 등에 이용하시면 유용할 겁니다.


* Permissions

디폴트로 안드로이드 내의 앱들은 sandbox화 돼 있습니다. 이 의미는 각 앱들은 고유의 username이 있다는 겁니다. 그리고 virtual machine에서 고유의 instance에서 실행된다는 것이구요. 또한 고유의 파일들과 메모리를 관리한다는 겁니다. 그래서 어떤 앱이 다른 앱 혹은 다른 전화기 등과 상호작용을 하도록 하려면 해당 permission을 요청해야 합니다.

Permission들은 AndroidManifest.xml에서 선언됩니다. 예를 들어 인터넷에 접근한다거나 SMS를 보내거나 전화기에 저장된 연락처들을 보거나 할 때 해당 퍼미션을 선언해야 합니다. 사용자가 앱을 다운받을 때 그 앱이 요청하는 퍼미션들을 보게 될 겁니다. 꼭 필요한 permission만 선언하는게 바람직합니다.


* JSON Parsing

API를 통해 데이터를 요청하면 종종 JSON 같은 format으로 데이터를 받게 됩니다. Open Weather Map API 를 사용할 때도 마찬가지인데요. JSON string을 받고 난 후 이를 이용하려면 일단 parse 해야 합니다.
JSON에 대해 알고 싶으면 이 tutorial을 참조하세요.

JSON의 구조에 대해 확실하게 모르면 formatter를 사용하실 수 있습니다. 브라우저에서 사용하실 수 있는 이런 formatter도 있습니다.

안드로이드에서는 JSONObject 클래스를 사용하실 수 있습니다. 이에 대한 설명은 여기에 있습니다. 이 클래스를 이용하려면 JSON string을 받아서 거기에 대한 객체를 생성해야 합니다.

JSONObject myJson = new JSONObject(myString);

그리고 나서 다양한 get 메소드를 사용해서 데이터를 추출할 수 있습니다. getJSONArray, getLong etc.

반응형

Comment