[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
Upcoming SlideShare
Loading in...5
×
 

[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)

on

  • 2,213 views

NEXTGRAM 만들기

NEXTGRAM 만들기
4일차 - Networking , JSON

Written by 정문철
Reviewed by 손영수

Statistics

Views

Total Views
2,213
Views on SlideShare
2,178
Embed Views
35

Actions

Likes
6
Downloads
71
Comments
0

3 Embeds 35

http://www.heej.net 32
http://nigayo.com 2
http://www.nigayo.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

[NEXT] Android 개발 경험 프로젝트 4일차 (Networking) [NEXT] Android 개발 경험 프로젝트 4일차 (Networking) Presentation Transcript

  • ANDROID
  •   -
  •   DAY
  •   4
  •    Network
  •   라는
  •   비에
  •   취해
  •   보다..
  • 학습목표 이 학습을 마치면… -HttpURLConnection을 사용하여 서버의 데이터를 다운로드 할 수 있습니다. ! -스레드를 사용하여 시간이 걸리는 작업을 비동기로 처리할 수 있습니다. ! -디바이스 내의 사진을 불러올 수 있습니다. ! -ProgressDialog를 사용할 수 있게 됩니다. ! -안드로이드 생명주기에 대한 형태를 간략하게나마 알 수 있습니다.
  • 이때까지 작업한 내용
  • 이때까지 HTML로 구현한 게시판을 안드로이드 플랫폼에서 다시 구현
  • DB의 데이터를 Adapter를 사용하여 리스트로 표현하였습니다.
  • 하지만 아직 네트워킹이 준비가 되질 않아 아무런 데이터도 서버로부터 받는것이 없었습니다.
  • 이번에 구현 할 내용 네트워크 (HTTP 통신)
  • 서버로부터 게시글의 정보를 가져와야하고…
  • 글쓰기 버튼을 눌러 사진을 선택하고 글을 쓰면 서버에 게시글이 업로드가 되고 리스트에 다시 반영이 된다.
  • 먼저 테스트코드로 파싱하던 JSON데이터를 서버로부터 받아오도록 하겠습니다.
  • 서버로부터 게시글의 정보를 json 형태로 불러오기
  • 기존의 수업에서 사용하시던 서버를 이용하시면 자신의 데이터에 맞게 예제를 변형하면서 진행하시면 됩니다.
  • 이제 안드로이드 NEXTAGRAM을 마저 만들어 보겠습니다.
  • 앞으로 구현해야 될 내용은…
  • SERVER Main 2)서버로 부터JSON으로 데이터 받음 1)데이터 요청 Proxy ProxyUP Dao 크게 나누어서 Proxy 클래스를 만들어 JSON데이터를 받는 부분과
  • SERVER Main 10)post방식으로 서버에 사진 전송 Proxy 8)글 입력 창으로 이동 ProxyUP ArticleWrite 9)글 제목,내용, 사진 경로등을 전달 Dao 7)Dao로 부터 가져온 데이터를 리스트에 표시 ProxyUP 클래스를 만들어 서버에 사진과 게시글 정보를 보내는 부분이 필요합니다.
  • 필요한 공통점은 HTTP통신…
  • 네트워크가 없는 안드로이드 앱은 뭔가 빠진 듯한… HTTP 클라이언트가 애플리케이션 개발의 중심이라고도 할 정도로 Android 애플리케이션에서는 HTTP 통신을 다루는 부분의 비중이 큽니다. (돈버는 앱들은 다 네트워크가 있습니다!!!)
  • HTTP 클라이언트 개발을 위해 Android SDK에서 제공하는 API를 사용하거나 오픈 소스 라이브러리를 활용하기도 하는 등 클래스 선택의 폭도 굉장히 많습니다.
  • Android의 HTTP 클라이언트 라이브러리 http://helloworld.naver.com/helloworld/377316 안드로이드가 HTTP 통신을 개발하기에 좋은 환경 같지만 불편한 점들이 많습니다.
  • 이 예제에서는 Android 개발팀이 권고한 HttpURLConnection을 사용합니다. ! 하지만 오히려 다른 방법에 비해 사용하기 복잡 할 수 있습니다. 다른 방법을 사용하고 싶으신 분은 다른 API나 라이브러리를 이용하여 구현할 수 있습니다. ! (단 사진을 post방식으로 업로드 하는 부분이 있으므로 사용하실려는 방법의 업로드 방식을 참고 후 선택하시길 권장합니다.) http://android-developers.blogspot.kr/2011/09/androids-http-clients.html
  • 삭제예정! 먼저 DB에 넣을때 사용했던 JSON테스트 데이터를 대신하여 서버로부터 데이터를 다운받도록 하겠습니다.
  • Proxy라는 클래스를 하나 생성합니다.
  • PROXY란? 디자인 패턴중에 나오는 용어로 마치 내 컴퓨터에 있는 클래스 같이 호출하는 것을 의미합니다. ! 위치 투명성 Location Transparency 를 제공합니다 !
  • 또한 MARSHLLER/UNMARSHALLER ! marshalling/unmarshalling이라는 것은 데이터를 변환해서 주고 받는 거에요. ! 네트워크에서 배운 encoding/decoding과 동일한 개념이에요. !
  • 전에 MainActivity에서 테스트 JSON형태의 String을 받아 Dao에 넘겨줬던 것처럼 String을 반환하는 함수를 만듭니다.
  • 자신의 서버 주소에 맞게 수정! 접속할 서버주소 로 URL 인스턴스를 만들고 HttpURLConnection에서 연결을 만들어 줍니다. (Try Catch 포함!)
  • 연결시의 Request Header정보를 설정해 주고 connect();로 연결을 합니다.
  • 어디서 많이 보던 내용… 네트워크 11주차 김종규 https://leansys.com/download/networks/lec11.pdf
  • Request Response 미리보는 패킷 분석 내용… (By Wireshark)
  • 그리고 getResponseCode()로 ResponseCode를 받아온 후 switch문을 이용하여 정상적으로 데이터를 받은 상태 (200,201)를 구분하여 줍니다.
  • 어디서 많이 보던 내용… 네트워크 11주차 김종규 https://leansys.com/download/networks/lec11.pdf
  • InputStreamReader와 BufferdReader를 이용하여 데이터를 받은 후 리턴을 해줍니다.
  • (Advanced를 위한) 생각해 봅시다. 과제가 아닙니다!! ResponseCode가 200대가 아니면 null을 리턴해 버립니다. 어떻게 처리하는것이 좋을까요? 또 200이여도 빈 값이 오면 어떻게 될까요?
  • 저번주에 MainActivity에서 테스트 함수로부터 JSON데이터를 가지고 왔습니다. 하지만 이번에는 아까 만든 Proxy로부터 서버에 접속하여 데이터를 가져오겠습니다.
  • Proxy 인스턴스를 만들고 좀 전에 만든 함수를 통해 서버의 데이터를 가져온 후 Dao에게 넘겨줍니다.
  • 다 잘 된것 같지만 지금 테스트를 하면 “permission denied” 라면서 앱이 오류가 나서 종료되어버립니다…
  • 안드로이드에서 네트워크를 사용하려면 앱 설정에 따로 권한을 받아야합니다.
  • 안드로이드에서는 앱마다 사용할 수 있는 권한을 명시하고 ! 사용자가 권한을 확인 할 수 있도록 합니다. ! 앱은 명시되지 않은 권한에 관련된 작업은 사용이 제한됩니다.
  • 프로젝트에서 AndroidManifest.xml을 편집하여 <uses-permission android:name="android.permission.INTERNET" />을 추가합니다.
  • 그래도 앱이 오류나서 종료되요!!!
  • 로그캣을 보겠습니다…
  • NetworkOnMainThreadException… ! 한때 준비안된 안드로이드 개발자들에게 멘붕을 안겨줬던 전설의?! 오류입니다. ! 안드로이드 버젼 3.0이상부터 발생한 에러로 간단히 설명하자면 네트워크 작업은 별도의 스레드에서 작업하라! 라는 의미입니다.
  • NetworkOnMainThreadException이 발생한 이유?! 구글은 생각하였습니다. 안드로이드가 iPh●ne에 비해 앱이 느리다고 하는데 주로 개발자가 잘못 만들어서라고! 이 이야기는 픽션입니다!
  • 2초후에 화면을 볼 수 있습니다. 메인스레드 (onCreate)안에서 네트워킹 작업을 하면 연결이 끝난 후에 화면이 표시됩니다. 테스트앱 http://ui.nhnnext.org/crong/scope/android/week4/ThreadTest.apk
  • 앱을 켰는데 멈춰 버렸잖아!! 사실은 네트워크 로딩중…
  • 0.2초만에 먼저 화면을 볼 수 있습니다. 하지만 스레드를 사용하면 미리 화면을 표시하고 네트워크 작업을 할 수 있습니다.
  • 구글은 생각하였습니다. 아무리 스레드를 쓰라고 권고해도 개발자들이 말을 듣지 않잖아! 아예 스레드를 안쓰면 앱이 실행도 안되게 만들면 개발자들이 스레드를 쓰겠지 그래서 3.0부터 멀쩡했던 코드가 안돌아가고 개발자들은 멘붕에 빠졌었습니다… 인터넷을 돌아다니다 보이는 코드들이 예전에 만들어진 것들은 이 문제로 인해 돌아가지 않는 경우가 많습니다.
  • 해결방법! - 안드로이드 버젼을 낮춘다. ! - 앱이 종료되지 않도록 메인스레드에서의 네트워킹을 허용하는 코드를 넣는다. ! - 스레드를 사용한다!
  • 안드로이드 버젼을 낮춘다.(비추) 사실… 좀… 너무… 좋치 않은 방법 사용하지 마세요…
  • 회피 코드를 넣는다. 메인에 다음과 같은 코드를 넣습니다. StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitNetwork().build()); 하지만 바람직한 방법은 아니니 테스트용도나 어쩔수 없는 경우에만 사용해주세요
  • 스레드를 사용한다! 보통 AsyncTask를 많이 사용하지만 이 예제에서는 간단히 스레드를 만들어서 사용합니다.
  • NEXTAGRAM에도 적용해 보겠습니다.
  • 하지만 그전에 스레드로 만들기 쉽도록 약간의 정리정돈을 하겠습니다.
  • 서버로부터 JSON 데이터를 가져와서 DB에 넣는 부분 DB로부터 게시글 데이터를 가져와서 리스트에 넣는 부분 지금 메인에 너무 많은 것들이 한번에 다 적혀있습니다.
  • refreshData라는 함수를 하나 만들어 코드를 옮겼습니다.
  • Dao를 전역으로 공통으로 써도 좋습니다… 마찬가지로 리스트와 관련된 listView라는 함수를 하나 만들어 코드를 옮겼습니다.
  • 이제 이 refreshData()함수에 스레드를 달아보겠습니다.
  • Thread를 생성하고 start()하면 끝입니다…
  • 바로 DB에 집어 넣는것을 끝내면 listView()를 호출하여 리스트를 표현해주고 싶지만 ! 바로 밑에서 호출을 하면 오류가 발생합니다.
  • 왜냐하면 스레드에서 바로 메인UI의 접근이 제한되어 있기 때문입니다. ! 그래서 Handler라는 것을 만들고 그 안에서 listView()를 호출합니다.
  • SERVER Main 2)서버로 부터JSON으로 데이터 받음 1)데이터 요청 Proxy ProxyUP 3)서버로부터 받은 데이터를 전달 Dao 이제 서버로부터 JSON을 받아 메인에 보내서 사용하는것까지 완료되었습니다.
  • 하지만 JSON은 다운 받았는데 서버에 있는 사진 파일은 다운로드를 받고 있지를 못하고 있습니다. ! 다운로드를 처리를 해주기 위한 새 클래스를 또 만들어 보겠습니다.
  • 서버로부터 파일(사진)을 다운받는 클래스 만들기 FILE
  • Proxy클래스와 거의 동일합니다. 하지만 파일을 다운 받는 클래스를 따로 만들어 놓으면 다른 개발을 할 때에도 여러모로 편리하므로 별도의 FileDownloader클래스를 만들어 보겠습니다.
  • 이 예제에서는 FileOutputStream openFileOutput을 사용하여 /data/data/<package_name>/files/<파일> 경로에 저장을 합니다. ! 따로 WRITE_EXTERNAL_STORAGE 권한이 필요없으나 ! 파일을 확인하기 위해서는 루팅이 안되어 있는 디바이스에서는 data폴더에 접근을 하지 못합니다. ! 다운을 받은 파일을 보고 싶으시면 루팅이 되어있는 디바이스, 제니모션(AVD)상에서 확인이 가능 합니다.
  • FileDownloader클래스를 만들고 생성자로 Context를 받아 보관합니다.
  • 파일을 받을 주소와 저장 할 이름을 받는 함수를 만들고 File에 context.getFilesDir().getPath() + "/" + fileName로 파일을 저장할 경로를 구합니다.
  • if (!filePath.exists()) { }를 이용하여 파일이 경로에 ‘없을’ 때에만 다운로드를 받도록 합니다.
  • JSON데이터를 받을때 처럼 HttpURLConnection로 연결을 합니다.
  • BufferedInputStream으로 데이터를 저장합니다. (Reader가 아닙니다!)
  • FileOutputStream openFileOutput을 사용하고 write()를 해서 파일을 기록합니다.
  • 외부에서 사용하실때에는 위와 같이 Context로 생성해주고 함수를 호출 해주기만 하면 됩니다. ! ! 하지만 이 역시 편하지만 문제가 있는 방식입니다. 좀더 방어적인 코드를 추가하거나 라이브러리를 사용해야 상용화를 할때 안정된 앱을 만들 수 있습니다.
  • SERVER Main 2)서버로 부터JSON으로 데이터 받음 1)데이터 요청 Proxy ProxyUP 3)서버로부터 받은 데이터를 전달 Dao 4)JSON 데이터를 Dao에 전달 5)JSON 데이터를 파싱하여 SQLite에 insert하기 FileDownloader 클래스를 사용할려면 JSON을 파싱하여 이미지의 주소를 알게되는 Dao에서 사용해 줘야할 것 같습니다.
  • Dao에서 DB에 데이터를 넣는 함수에 Context를 넣어 FileDownloader를 만들어 줍니다.
  • 자신의 서버 주소에 맞게 수정! 데이터를 다 파싱하였을때 파일도 다운로드하도록 좀 전에 만든 함수를 호출하여줍니다. (파일 경로, 파일명)
  • SERVER Main 2)서버로 부터JSON으로 데이터 받음 1)데이터 요청 Proxy 이미지 파일 다운 받음 3)서버로부터 받은 데이터를 전달 Dao 4)JSON 데이터를 Dao에 전달 5)JSON 데이터를 파싱하여 SQLite에 insert하기 지금까지의 진행 사항
  • 서버로부터 데이터를 받는 부분을 고치는 것은 거의 다 끝나가지만 아직 고치지 않은 곳이 있습니다.
  • CustomAdapter의 ImageView의 부분으로 지금은 Asset에 있는 이미지를 가져와 리스트에 표시를 하고 있습니다. ! 이 부분을 FileDownloader로 다운받은 이미지를 가져와서 ImageView에 표시하도록 해야합니다.
  • FileDownloader에서 한것처럼 FileDir을 가져온 후 BitmapFactory로 Bitmap으로 만들어 ImageView에 넣어 줍니다.
  • 데이터가 잘 표시되고 있습니다^^
  • 마찬가지로 ArticleViewer Activity에도 Asset이 아니라 File로 사진을 가져오게 합니다.
  • CustomAdapter Class에서 하였던것과 동일하게 article로부터 getImgName()으로 파일명을 받아와 Bitmap으로 ImageView에 표시를 합니다.
  • (Advanced를 위한) 생각해 봅시다. 과제가 아닙니다!! 안드로이드에서 개발자를 가장 괴롭히는 것중 하나가 OutOfMemory입니다…(특히 이미지를 불러올때!) ! 디바이스 자체 메모리도 적은데다가 실제로 앱에서 그 용량을 전부 다 쓸 수 없기 때문입니다. (dalvik VM이 프로세스마다 다른 메모리를 할당해 줍니다.) ! 메모리를 회수하기 위해 recycle()을 잘 사용하고 ! 처음 이미지를 불러올때에도 리사이징해서 필요한 만큼만 불러오는 방법등 ! 여러가지 방법들을 조사해서 적용시켜 보시길 바랍니다… Android 앱 메모리 최적화 - NHN 개발자 블로그 http://helloworld.naver.com/helloworld/539525
  • 게시글 업로드 하기
  • SERVER Main Proxy 1)글 입력 창으로 이동 ProxyUP ArticleWrite Dao
  • SERVER Main Proxy 1)글 입력 창으로 이동 ProxyUP ArticleWrite 2)글 제목,내용, 사진 경로등을 전달 Dao
  • SERVER Main 3)post방식으로 서버에 사진 전송 Proxy 1)글 입력 창으로 이동 ProxyUP ArticleWrite 2)글 제목,내용, 사진 경로등을 전달 Dao
  • 쓰기 버튼을 누르면 글 쓰기용 액티비트로 이동
  • 디바이스 내에 있는 사진 파일 가져오기
  • Intent startActivityForResult
  • 단순히 화면 전환을 위해 사용하던 Intent를 데이터를 요청하고 그 결과를 받아오는 용도로 사용합니다.
  • [Android] startActivityForResult(), onActivityResult() 사용하기 http://blog.naver.com/hisukdory/50088038280
  • 쓰기 버튼 EditText ImageButton EditText EditText ArticleWriter 레이아웃 구성 누르면 글이 업로드 누르면 사진 선택
  • ArticleWriter Activity를 생성한 다음 레이아웃의 위젯들의 Id를 다 찾아주세요… (마지막 노가다…)
  • MainActivity에 인텐트를 걸어주세요^^; refresh버튼에는 refreshData()를 호출하도록 하였습니다.
  • 버튼에 OnClickListener를 달아 주세요
  • 사진 선택 버튼에 Intent에 Activity Class가 아닌 Intent.ACTION_PICK와 setType()으로 Images.Media.CONTENT_TYPE 타입과 setData()Images.Media.EXTERNAL_CONTENT_URI 데이터를 넣어 주세요
  • 매번 하던 startActivity()가 아니라 startActivityForResult()로 Intent를 요청해 주세요 2번째 인자는 요청에 대한 내용을 구분하기 위한 int값인데 구분하기 쉽도록 REQUEST_PHOTO_ALBUM으로 변수를 하나 만들어 사용하였습니다.
  • 결과(데이터)를 받아오는 함수 작성하기 [Android] startActivityForResult(), onActivityResult() 사용하기 http://blog.naver.com/hisukdory/50088038280
  • startActivityForResult()로 호출한 결과는 onActivityResult()로 돌아옵니다.
  • startActivityForResult()에 두번째 인자로 requestCode로 어떤 요청으로부터 돌아온 결과인지를 if문으로 구분 합니다.
  • 안드로이드에는 여러 앱들이 서로 데이터를 주고 받기 위하여 Content Provider를 사용합니다. ! 이 Content Provider는 content://~~로 시작하는 CONTENT_URI를 사용합니다. (ex. content://media/external/images/media/317930) ! 문제는 이것이 실제 파일의 주소가 아니라 Content Provider를 통해야 하는 주소여서 ! 파일을 업로드 하기 위해서는 실제 주소가 필요합니다. ! 실제 주소를 얻는 함수는 아래의 주소에서 복사해주시길 바랍니다. http://pastebin.com/7iJxYXYN Android Basic시간에!
  • 실제 주소를 가져오는 함수를 넣었습니다…
  • Result에 돌아오는 Intent data로부터 getData()를 한 후 getRealPathUri()함수를 이용하여 실제 Uri를 받아왔습니다. ! String 변수에 실제 경로와 파일명을 저장하였습니다.
  • CustomAdapter에서 한 것처럼 사진 파일을 Bitmap으로 바꾸어 이미지를 표시합니다.
  • 킷캣부터 Manifest 권한 관리가 더 엄격해졌습니다. AndroidManifest.xml파일에 전에 인터넷 권한을 주었던 것처럼 ! <uses-permission android:name=“android.permission.READ_EXTERNAL_STORAGE"/> 외부파일 읽기 권한을 주세요…
  • 사진 추가 버튼을 누르고 앨범에서 사진을 선택을 하면 이미지 버튼에 선택한 사진이 잘 표시 됩니다^^
  • 사용자가 사진을 선택하다 도중에 취소를 하면 null값이 리턴될 수 있습니다. ! 이를 회피하기 위해 try catch로 잘 회피합시다…
  • 너무 큰 사진파일을 넣으면 OutOfMemory가 발생하여 앱이 종료 될 수 있습니다. ! 가능하면 아래의 샘플이미지 생성 앱을 사용하여 작은 사진파일을 업로드해 주세요 (이미지 최적화, 메모리 관리가 필요합니다.) http://ui.nhnnext.org/crong/scope/android/week4/TestPhotoCopier.apk
  • 다운 받으신 apk파일을 제니모션 안으로 넣어주세요
  • COPY! 버튼을 누르면 ! 샘플로 사용될 이미지들이 복사됩니다.
  • 갤러리에 보시면 NEXTAGRAM이라는 폴더에 복사된 사진이 표시됩니다. ! 혹 사진이 보이지 않으면 미디어 스캔을 해주시거나 단말기를 재시작해주세요
  • SERVER Main Proxy 1)글 입력 창으로 이동 ProxyUP ArticleWrite 2)글 제목,내용, 사진 경로등을 전달 Dao 이때까지 글쓰기 내용을 입력하는 부분을 하였고 이제 업로드 하는 클래스를 만들어 보겠습니다.
  • 업로드를 담당하는 ProxyUP 클래스를 만들어 보겠습니다.
  • 기본적인 구조는 기존의 Proxy와 동일하지만 HttpURLConnection에서의 Post방식의 업로드는 네트워크의 선행이 갖추어지지 않으면 상당히 어려운 부분이 많습니다… ! 따라서 이번 예제에서는 샘플코드를 제공하고 설명만 하도록 하겠습니다. ! 혹 직접 구현하고 싶으신 분은 이 방법이나 다른 방법을 이용하시길 바랍니다. (Apache HttpComponents 등등…) http://pastebin.com/EWUwmThC
  • 복붙의 결과로 다음과 같은 긴 클래스가 생겼습니다… ! 패키지명과 서버주소를 자신에게 맞추어서 수정해주세요
  • 여기서 사용할 함수인 uploadArticle은 게시글 정보를 담고있는 Article하고 사진이 있는 파일 경로를 받습니다. ! 기본적인 내용은 Proxy때와 같지만 Content-Type 부분이 달라졌습니다.
  • 어디서 많이 보던 내용… 네트워크 11주차 김종규 https://leansys.com/download/networks/lec11.pdf
  • 구분자 미리보는 패킷 분석 내용… (By Wireshark)
  • 이 부분은 Stream으로 데이터를 쓰는 부분으로 게시글의 내용을 업로드하고 있습니다.
  • KEY VALUE getPostData함수는 POST형식에 맞게 데이터를 가공해줍니다.
  • 이 부분은 POST방식으로 파일을 업로드 하는 부분입니다. 먼저 Content name 을 uploadedfile로 하고 FileInputStream으로 파일을 읽어들이면서 서버에 업로드를 하고 있습니다.
  • uploadedfile이라는 이름의 파일 데이터를 받기 post방식으로 각 이름별로 데이터를받아서 변수에 담기 서버의 upload.php파일을 다시 보면 앞에서 사용한 이름으로 데이터를 구분해서 처리하고 있습니다.
  • 나머지 부분은 Proxy와 마찬가지로 서버의 데이터를 받아와 String형태로 리턴해줍니다. (이 예제에서는 이 데이터에 대한 예외처리는 하지 않습니다.)
  • SERVER Main 3)post방식으로 서버에 사진 전송 Proxy 1)글 입력 창으로 이동 ProxyUP ArticleWrite 2)글 제목,내용, 사진 경로등을 전달 Dao 포스트 방식으로 업로드하는 함수는 구현이 되어있고…
  • SERVER Main Proxy 1)글 입력 창으로 이동 ProxyUP ArticleWriter 2)글 제목,내용, 사진 경로등을 전달 Dao ArticleWriter Activity에서 ProxyUP으로 데이터를 보내주는 부분을 마저 구현해보겠습니다.
  • 다시 ArticleWriter Activity로 돌아와 Write버튼에 마저 이벤트를 달아줍니다.
  • 네트워크 작업이므로 스레드를 만들어주고…
  • Article클래스로 게시글 정보를 만들어줍니다.
  • 사실 ID는 이 클라이언트가 ID, PASS기반 인증을 안해서 안드로이드 디바이스의 고유번호인 ANDROID_ID를 이용하여 고유값을 ID로 사용합니다. ! DATE는 SimpleDateFormat을 이용하여 ‘년월일 시분’단위로 표시합니다.
  • 이제 ProxyUP클래스에 article과 사진의 경로를 보내주면 업로드가 진행됩니다.
  • (Advanced를 위한) 생각해 봅시다. 과제가 아닙니다!! 파일명을 아무런 변경없이 그대로 서버에 올라가 전송이 되고 있습니다. ! 만약 같은 파일명의 다른 사진이 서버에 올라가면 어떻게 될까요? 타임이나 각종 여러 값을 이용해서 간단하게 파일명을 만들어주는 함수를 하나 만들어봐보세요 ! ! ID로 사용한 ANDROID_ID는 개인정보에 해당하는 정보입니다. 수집시의 법적인 동의 요구절차는 둘째치고 노출되어서 좋을것은 없는 정보입니다. ! 항상 같은 값만 가지면 되므로 ID를 암호화를 하는 함수를 하나 만들어봐보세요
  • 글쓰기 버튼을 누르고…
  • 어라? 반응이 없네 업로드가 된건가?
  • 메인으로 돌아가서 새로고침을 누르니까 업로드 되었던 내용이 나오네…
  • 불편한 경우가 몇개 있는데 개선한 방법은 없을까?
  • 게시글이 업로드 중임을 알려주자!
  • 강의자료 로딩중
  • 강의자료 로딩중
  • 강의자료 로딩중
  • 강의자료 로딩중
  • 강의자료 로딩중
  • 강의자료 로딩중
  • 강의자료 로딩중
  • 강의자료 로딩중
  • ProgressDialog를 만들어 봅시다!
  • ArticleWriter Activity에 ProgressDialog를 만들어줍니다.
  • 스레드 안에서 UI를 제어해야 하므로 Handler를 만들어서 사용합니다.
  • ProgressDialog.show(Context, “Title”, “Message”)를 이용해 진행창을 표시합니다.
  • 작업이 끝난 부분에도 Handler를 만들고 그 안에 cancel()을 사용 해 ProgressDialog를 닫고 ! 더 이상 ArticleWriter Activity에서 할 일이 없으므로 finish()를 사용하여 Activity를 종료합니다.
  • ProgressDialog 실행 시간이 걸리는 작업 실행 ProgressDialog 닫기
  • 업로드중입니다.
  • 이번엔 새로고침 버튼을 안눌러도 새로고침이 되도록 합니다.
  • 안드로이드에는 생명주기라는 것이 있습니다. Managing the Activity Lifecycle http://developer.android.com/training/basics/activity-lifecycle/starting.html
  • 이때까지 주로 이 Create단에서 작업을 해왔습니다. 이 부분은 Activity가 생성될때 한번만 실행됩니다. Managing the Activity Lifecycle http://developer.android.com/training/basics/activity-lifecycle/starting.html
  • 하지만 Resume에서 작업을 하게 되면 Pause가 되었던 Stop이 되었던 Activity가 다시 실행할때 호출이 됩니다. Managing the Activity Lifecycle http://developer.android.com/training/basics/activity-lifecycle/starting.html
  • 이 Resume부분에 새로고침 함수를 넣어서 Activity가 다시 보여질때마다 새로고침이 되도록 해봅니다. ! 자세한 내용은 Android Basic에서! Managing the Activity Lifecycle http://developer.android.com/training/basics/activity-lifecycle/starting.html
  • Main Activity를 보면 onCreate()가 있고 그 안에 새로고침이 있습니다.
  • onResume()을 만들고 onCreate()에 있던 내용을 옮겨 넣습니다.
  • 이렇게 되면 Activity가 Stop이 되었거나 Pause상황이 되었을때 (다른 앱에서 finish()로 넘어오거나 디바이스 화면 전원을 껏다 켰을때) 다시 onResume()이 호출되고 리스트 새로고침을 합니다. Managing the Activity Lifecycle http://developer.android.com/training/basics/activity-lifecycle/starting.html
  • NEXTAGTAM 완성!
  • 하지만 완성도를 높이기 위한 수정은 필수!
  • Advanced를 목표로 하시는 분은 레이아웃이나 글자 크기등등 UI보다는 ! 생각해보기의 내용들을 한번 해결을 해보시면 좋을것같습니다
  • 그래도 시간이 남으신다면…
  • 액션바 사이드 네비게이션 아래의 링크 자료를 참고하셔서 액션바나 사이드 네비게이션을 구현해보세요!
  • 정리하기
  • 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에 데이터를 저장하여 원하는 형태로 보여주는 시중의 많은 앱들과 비슷한 형태를 구현을 해보았습니다.
  • 이 개발경험 프로젝트에서의 예제는 자주 사용되는 여러가지 요소를 경험을 해보기 위해 깊게 나가지 못한 부분이 있습니다. ! 이런 부분은 Android수업시간에서 좀더 깊게 배우시면 될 것 같습니다^^;
  • 수고하셨습니다^^