10. 학습목표
이 학습을 마치면…
-HttpURLConnection을 사용하여 서버의 데이터를
다운로드 할 수 있습니다.
!
-스레드를 사용하여 시간이 걸리는 작업을 비동기로 처리할 수 있습니다.
!
-디바이스 내의 사진을 불러올 수 있습니다.
!
-ProgressDialog를 사용할 수 있게 됩니다.
!
-안드로이드 생명주기에 대한 형태를 간략하게나마 알 수 있습니다.
24. SERVER
Main
10)post방식으로 서버에 사진 전송
Proxy
8)글 입력 창으로 이동
ProxyUP
ArticleWrite
9)글 제목,내용, 사진 경로등을 전달
Dao
7)Dao로 부터 가져온
데이터를 리스트에 표시
ProxyUP 클래스를 만들어
서버에 사진과 게시글 정보를 보내는 부분이 필요합니다.
26. 네트워크가 없는 안드로이드 앱은 뭔가 빠진 듯한…
HTTP 클라이언트가 애플리케이션 개발의 중심이라고도 할 정도로
Android 애플리케이션에서는 HTTP 통신을 다루는 부분의 비중이 큽니다.
(돈버는 앱들은 다 네트워크가 있습니다!!!)
27. HTTP 클라이언트 개발을 위해 Android SDK에서 제공하는 API를
사용하거나 오픈 소스 라이브러리를 활용하기도 하는 등
클래스 선택의 폭도 굉장히 많습니다.
28. Android의 HTTP 클라이언트 라이브러리
http://helloworld.naver.com/helloworld/377316
안드로이드가 HTTP 통신을 개발하기에 좋은 환경 같지만
불편한 점들이 많습니다.
29. 이 예제에서는 Android 개발팀이
권고한 HttpURLConnection을 사용합니다.
!
하지만 오히려 다른 방법에 비해 사용하기 복잡 할 수 있습니다.
다른 방법을 사용하고 싶으신 분은 다른 API나 라이브러리를
이용하여 구현할 수 있습니다.
!
(단 사진을 post방식으로 업로드 하는 부분이 있으므로
사용하실려는 방법의 업로드 방식을 참고 후 선택하시길 권장합니다.)
http://android-developers.blogspot.kr/2011/09/androids-http-clients.html
55. 0.2초만에 먼저 화면을
볼 수 있습니다.
하지만 스레드를 사용하면
미리 화면을 표시하고
네트워크 작업을 할 수 있습니다.
56. 구글은 생각하였습니다.
아무리 스레드를 쓰라고 권고해도
개발자들이 말을 듣지 않잖아!
아예 스레드를 안쓰면 앱이
실행도 안되게 만들면
개발자들이 스레드를 쓰겠지
그래서 3.0부터 멀쩡했던 코드가 안돌아가고
개발자들은 멘붕에 빠졌었습니다…
인터넷을 돌아다니다 보이는 코드들이 예전에 만들어진 것들은
이 문제로 인해 돌아가지 않는 경우가 많습니다.
57. 해결방법!
- 안드로이드 버젼을 낮춘다.
!
- 앱이 종료되지 않도록 메인스레드에서의
네트워킹을 허용하는 코드를 넣는다.
!
- 스레드를 사용한다!
59. 회피 코드를 넣는다.
메인에 다음과 같은 코드를 넣습니다.
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitNetwork().build());
하지만 바람직한 방법은 아니니
테스트용도나 어쩔수 없는 경우에만 사용해주세요
73. Proxy클래스와 거의 동일합니다.
하지만 파일을 다운 받는 클래스를 따로 만들어 놓으면
다른 개발을 할 때에도 여러모로 편리하므로
별도의 FileDownloader클래스를 만들어 보겠습니다.
74. 이 예제에서는 FileOutputStream openFileOutput을 사용하여
/data/data/package_name/files/파일
경로에 저장을 합니다.
!
따로 WRITE_EXTERNAL_STORAGE 권한이 필요없으나
!
파일을 확인하기 위해서는
루팅이 안되어 있는 디바이스에서는 data폴더에 접근을 하지 못합니다.
!
다운을 받은 파일을 보고 싶으시면
루팅이 되어있는 디바이스, 제니모션(AVD)상에서 확인이 가능 합니다.
81. 외부에서 사용하실때에는 위와 같이 Context로 생성해주고
함수를 호출 해주기만 하면 됩니다.
!
!
하지만
이 역시 편하지만 문제가 있는 방식입니다.
좀더 방어적인 코드를 추가하거나 라이브러리를 사용해야
상용화를 할때 안정된 앱을 만들 수 있습니다.
82. SERVER
Main
2)서버로 부터JSON으로 데이터 받음
1)데이터 요청
Proxy
ProxyUP
3)서버로부터 받은 데이터를 전달
Dao
4)JSON 데이터를 Dao에 전달
5)JSON 데이터를 파싱하여
SQLite에 insert하기
FileDownloader 클래스를 사용할려면
JSON을 파싱하여 이미지의 주소를 알게되는 Dao에서 사용해 줘야할 것 같습니다.
83. Dao에서 DB에 데이터를 넣는 함수에
Context를 넣어 FileDownloader를 만들어 줍니다.
84. 자신의 서버 주소에 맞게 수정!
데이터를 다 파싱하였을때
파일도 다운로드하도록 좀 전에 만든
함수를 호출하여줍니다. (파일 경로, 파일명)
85. SERVER
Main
2)서버로 부터JSON으로 데이터 받음
1)데이터 요청
Proxy
이미지 파일 다운 받음
3)서버로부터 받은 데이터를 전달
Dao
4)JSON 데이터를 Dao에 전달
5)JSON 데이터를 파싱하여
SQLite에 insert하기
지금까지의 진행 사항
86. 서버로부터 데이터를 받는 부분을 고치는 것은
거의 다 끝나가지만 아직 고치지 않은 곳이 있습니다.
92. (Advanced를 위한)
생각해 봅시다.
과제가 아닙니다!!
안드로이드에서 개발자를 가장 괴롭히는 것중 하나가
OutOfMemory입니다…(특히 이미지를 불러올때!)
!
디바이스 자체 메모리도 적은데다가
실제로 앱에서 그 용량을 전부 다 쓸 수 없기 때문입니다.
(dalvik VM이 프로세스마다 다른 메모리를 할당해 줍니다.)
!
메모리를 회수하기 위해 recycle()을 잘 사용하고
!
처음 이미지를 불러올때에도
리사이징해서 필요한 만큼만 불러오는 방법등
!
여러가지 방법들을 조사해서
적용시켜 보시길 바랍니다…
Android 앱 메모리 최적화 - NHN 개발자 블로그
http://helloworld.naver.com/helloworld/539525
106. 사진 선택 버튼에
Intent에 Activity Class가 아닌 Intent.ACTION_PICK와
setType()으로 Images.Media.CONTENT_TYPE 타입과
setData()Images.Media.EXTERNAL_CONTENT_URI
데이터를 넣어 주세요
107. 매번 하던 startActivity()가 아니라 startActivityForResult()로
Intent를 요청해 주세요 2번째 인자는 요청에 대한 내용을 구분하기 위한
int값인데 구분하기 쉽도록 REQUEST_PHOTO_ALBUM으로
변수를 하나 만들어 사용하였습니다.
108. 결과(데이터)를 받아오는 함수 작성하기
[Android] startActivityForResult(), onActivityResult() 사용하기
http://blog.naver.com/hisukdory/50088038280
111. 안드로이드에는 여러 앱들이 서로 데이터를
주고 받기 위하여 Content Provider를 사용합니다.
!
이 Content Provider는 content://~~로 시작하는
CONTENT_URI를 사용합니다.
(ex. content://media/external/images/media/317930)
!
문제는 이것이 실제 파일의 주소가 아니라
Content Provider를 통해야 하는 주소여서
!
파일을 업로드 하기 위해서는 실제 주소가 필요합니다.
!
실제 주소를 얻는 함수는 아래의 주소에서 복사해주시길 바랍니다.
http://pastebin.com/7iJxYXYN
Android Basic시간에!
115. 킷캣부터 Manifest 권한 관리가 더 엄격해졌습니다.
AndroidManifest.xml파일에
전에 인터넷 권한을 주었던 것처럼
!
uses-permission android:name=“android.permission.READ_EXTERNAL_STORAGE/
외부파일 읽기 권한을 주세요…
116. 사진 추가 버튼을 누르고 앨범에서 사진을 선택을 하면
이미지 버튼에 선택한 사진이 잘 표시 됩니다^^
117. 사용자가 사진을 선택하다 도중에 취소를 하면
null값이 리턴될 수 있습니다.
!
이를 회피하기 위해 try catch로 잘 회피합시다…
118. 너무 큰 사진파일을 넣으면
OutOfMemory가 발생하여
앱이 종료 될 수 있습니다.
!
가능하면 아래의 샘플이미지 생성 앱을 사용하여
작은 사진파일을 업로드해 주세요
(이미지 최적화, 메모리 관리가 필요합니다.)
http://ui.nhnnext.org/crong/scope/android/week4/TestPhotoCopier.apk
124. 기본적인 구조는 기존의 Proxy와 동일하지만
HttpURLConnection에서의 Post방식의 업로드는
네트워크의 선행이 갖추어지지 않으면
상당히 어려운 부분이 많습니다…
!
따라서 이번 예제에서는 샘플코드를 제공하고
설명만 하도록 하겠습니다.
!
혹 직접 구현하고 싶으신 분은 이 방법이나
다른 방법을 이용하시길 바랍니다.
(Apache HttpComponents 등등…)
http://pastebin.com/EWUwmThC
125. 복붙의 결과로 다음과 같은 긴 클래스가 생겼습니다…
!
패키지명과 서버주소를 자신에게 맞추어서 수정해주세요
126. 여기서 사용할 함수인 uploadArticle은 게시글 정보를 담고있는
Article하고 사진이 있는 파일 경로를 받습니다.
!
기본적인 내용은 Proxy때와 같지만 Content-Type 부분이 달라졌습니다.
127. 어디서 많이 보던 내용…
네트워크 11주차 김종규
https://leansys.com/download/networks/lec11.pdf
141. (Advanced를 위한)
생각해 봅시다.
과제가 아닙니다!!
파일명을 아무런 변경없이
그대로 서버에 올라가 전송이 되고 있습니다.
!
만약 같은 파일명의 다른 사진이 서버에 올라가면 어떻게 될까요?
타임이나 각종 여러 값을 이용해서 간단하게 파일명을 만들어주는
함수를 하나 만들어봐보세요
!
!
ID로 사용한 ANDROID_ID는
개인정보에 해당하는 정보입니다.
수집시의 법적인 동의 요구절차는 둘째치고
노출되어서 좋을것은 없는 정보입니다.
!
항상 같은 값만 가지면 되므로
ID를 암호화를 하는 함수를 하나 만들어봐보세요
163. 안드로이드에는 생명주기라는 것이 있습니다.
Managing the Activity Lifecycle
http://developer.android.com/training/basics/activity-lifecycle/starting.html
164. 이때까지 주로 이 Create단에서 작업을 해왔습니다.
이 부분은 Activity가 생성될때 한번만 실행됩니다.
Managing the Activity Lifecycle
http://developer.android.com/training/basics/activity-lifecycle/starting.html
165. 하지만 Resume에서 작업을 하게 되면
Pause가 되었던 Stop이 되었던
Activity가 다시 실행할때 호출이 됩니다.
Managing the Activity Lifecycle
http://developer.android.com/training/basics/activity-lifecycle/starting.html
166. 이 Resume부분에 새로고침 함수를 넣어서
Activity가 다시 보여질때마다 새로고침이 되도록 해봅니다.
!
자세한 내용은 Android Basic에서!
Managing the Activity Lifecycle
http://developer.android.com/training/basics/activity-lifecycle/starting.html
176. SERVER
Main
2)서버로 부터JSON으로 데이터 받음
10)post방식으로 서버에 사진 전송
Proxy
1)데이터 요청
ProxyUP
3)서버로부터 받은 데이터를 전달
8)글 입력 창으로 이동
ArticleWrite
9)글 제목,내용, 사진 경로등을 전달
Dao
4)JSON 데이터를 Dao에 전달
7)Dao로 부터 가져온
데이터를 리스트에 표시
5)JSON 데이터를 파싱하여
SQLite에 insert하기
이때까지 서버
6)Dao에 저장되어 있는 게시글 데이터를 가져오기
이때까지 안드로이드로 서버와 데이터를 주고 받고
DB에 데이터를 저장하여 원하는 형태로 보여주는
시중의 많은 앱들과 비슷한 형태를 구현을 해보았습니다.
177. 이 개발경험 프로젝트에서의 예제는
자주 사용되는 여러가지 요소를 경험을 해보기 위해
깊게 나가지 못한 부분이 있습니다.
!
이런 부분은 Android수업시간에서
좀더 깊게 배우시면 될 것 같습니다^^;