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

최근에 받은 트랙백

글 보관함

Udacity 강좌 - Lesson 2 실습 01

2016. 8. 9. 18:14 | Posted by 솔웅


날씨 정보를 받을 싸이트

http://openweathermap.org/

정보를 받으려면 API Key 를 사용해야 함. 내 API Key 받는 곳

http://openweathermap.org/appid#get

API Key 관련 update 된 Sunshine 소스 코드

https://github.com/udacity/Sunshine-Version-2

https://docs.google.com/document/d/1e8LXahedBlCW1_dp_FyvQ3ugUAwUBJDuJCoKf3tgNVs/pub?embedded=true

Permission과 Privacy 에 대한 정보

https://developer.android.com/preview/features/runtime-permissions.html


Open weather map 싸이트로 부터 날씨 정보 받는 신택스

api.openweathermap.org/data/2.5/weather?q=London,uk&APPID={APIKEY}

날씨정보는 우편번호, 도시 이름 등으로 받을 수 있다. i.e. 55347, USA

7일치 날씨 정보를 볼 수 있는 곳

http://openweathermap.org/forecast

16일치 날씨 정보

http://openweathermap.org/forecast#16days



Weather 에 대한 HTTP Request 하기
1. HTTP Request 만들기 : HttpURLConnection
2. input stream 으로부터 response 읽기 : BufferedReader , InputStream
3. 로그 만들기

https://gist.github.com/udacityandroid/d6a7bb21904046a91695

// These two need to be declared outside the try/catch
            // so that they can be closed in the finally block.
            HttpURLConnection urlConnection = null;
            BufferedReader reader = null;

            // Will contain the raw JSON response as a string.
            String forecastJsonStr = null;

            try {
                // Construct the URL for the OpenWeatherMap query
                // Possible parameters are avaiable at OWM's forecast API page, at
                // http://openweathermap.org/API#forecast
                URL url = new URL("http://api.openweathermap.org/data/2.5/forecast/daily?q=94043&mode=json&units=metric&cnt=7");

                // Create the request to OpenWeatherMap, and open the connection
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();

                // Read the input stream into a String
                InputStream inputStream = urlConnection.getInputStream();
                StringBuffer buffer = new StringBuffer();
                if (inputStream == null) {
                    // Nothing to do.
                    return null;
                }
                reader = new BufferedReader(new InputStreamReader(inputStream));

                String line;
                while ((line = reader.readLine()) != null) {
                    // Since it's JSON, adding a newline isn't necessary (it won't affect parsing)
                    // But it does make debugging a *lot* easier if you print out the completed
                    // buffer for debugging.
                    buffer.append(line + "\n");
                }

                if (buffer.length() == 0) {
                    // Stream was empty.  No point in parsing.
                    return null;
                }
                forecastJsonStr = buffer.toString();
            } catch (IOException e) {
                Log.e("PlaceholderFragment", "Error ", e);
                // If the code didn't successfully get the weather data, there's no point in attemping
                // to parse it.
                return null;
            } finally{
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (final IOException e) {
                        Log.e("PlaceholderFragment", "Error closing stream", e);
                    }
                }
            }

            return rootView;
        }
    }
}


소스 코드 분석

우선 HttpURLConnection과 BufferedReader 변수를 선언한다.

이렇게 하면 나중에 finally block 에서 connection을 해제 할 수 있다.

그리고 날씨 정보를 요청할 쿼리를 담을 String 변수도 try 만 밖에 선언한다.

try 문 안에서는 날씨를 요청할 쿼리 (URL)을 URL 변수에 담는다.

그리고 아까 만들어 놨던 HttpURLConnection 변수 (urlConnection)를 사용해서 connection을 open 하고 Request Method를 GET으로 선언하고 실제로 connect 한다.


이제 URL을 String에 넣는 작업을 한다.

먼저 URL 을 InputStream 변수에 넣은 다음에 처음에 만들어 놨던 BufferedReader 변수(reader) 에 이 InputStream 을 담는다.

그리고 이 reader를 while 문을 통해 StringBuffer 에 담는다.

마지막으로 try문 밖에서 선언했던 String 변수 (forecastJsonStr) 에 이 StringBuffer (buffer)의 내용을 담는다.


이렇게 하면 URL 형식의 날씨 요청 쿼리를 사용해서 connection을 열고 이 쿼리를 String 변수에 담는 것까지 완료 됐습니다.


catch 문에는 Exception이 발생 했을 경우 Log를 남기고 null을 return 하도록 하구요.


Exception이 있던 없던 실행되는 finally 구문에서는 urlConnection을 disconnect 합니다.

그리고 BurreredReader 도 close 하구요.


새로 추가할 소스 분석은 여기까지구요.

참고로 HTTP 연결은 HTTPUrlConnection 과 HttpClient 두개 다 사용 가능한다. HTTPUrlConnection을 추천한답니다.

https://developer.android.com/training/basics/network-ops/connecting.html

http://android-developers.blogspot.com/2011/09/androids-http-clients.html?_sm_au_=iRVfk4LV6Z6647f6



Android Studio에는 로그를 볼 수 있는 Logcat이 있는데요.

Android Studio의 안드로이드 아이콘을 클릭하면 DDMS가 실행되고 이 DDMS 안에 LogCat 창이 있습니다.

https://developer.android.com/studio/command-line/adb.html?utm_source=udacity&utm_medium=mooc&utm_term=android&utm_content=adb&utm_campaign=training

Log Level은 아래와 같습니다.

- ERROR
- WARN
- INFO
- DEBUG
- VERBOSE

다음 글에서는 위의 새로운 소스 코드를 실제로 파일에 추가하고 refactoring 하고 실행해 보는 것 까지 할 것 같습니다.



반응형

Comment