470 likes | 641 Views
만들면서 배우는 Android 세미나. 3. Network Connection, Fragment. 시작하기전에. AVD 를 켭니다 . 새로운 프로젝트를 만듭니다 . 시작하기전에 배경지식을 쌓기위해 다음 키워드에 대해 배우겠습니다 . GET / POST JSON Stream Thread 저 4 가지 키워드 하나하나가 정말 중요하면서 어려운 개념이기때문에 주의깊게 듣고 , 모르는게 있으면 꼭 질문하세요 이거 모르면 아무것도 못해요. Get / Post. Http request 의 두가지 방식
E N D
만들면서 배우는 Android 세미나 3. Network Connection, Fragment
시작하기전에 • AVD를 켭니다. • 새로운 프로젝트를 만듭니다. • 시작하기전에 배경지식을 쌓기위해 다음 키워드에 대해 배우겠습니다. • GET / POST • JSON • Stream • Thread • 저 4가지 키워드 하나하나가 정말 중요하면서 어려운 개념이기때문에 주의깊게 듣고, 모르는게 있으면 꼭 질문하세요이거 모르면 아무것도 못해요
Get / Post • Http request의 두가지 방식 • Get : 값을 request url로 전달한다. • Post : 값을 Http request header로 전달한다. • 자세한 설명은 생략한다.
Get / Post example • 생략하려고 했는데 아무래도 알아야 할 것 같다. • height = 180, weight = 65 라는 정보를 전달하고 싶다.
Get 방식으로 보내면 • Get 방식 • http://foo.bar.com/main?height=180&weight=65 • 으로 요청해서 전달한다. • request header에는 특별한 게 없다. • GET /main?height=180&weight=65 HTTP/1.1 Host: foo.bar.com Cache-Control: no-cache Content-Type: application/x-www-form-urlencoded
Post 방식으로 보내면 • request url은 그대로두고 • http://foo.bar.com/main/ • request header에 data가 포함된다. • POST /main HTTP/1.1 Host: foo.bar.com Cache-Control: no-cache Content-Type: application/x-www-form-urlencoded height=165&weight=80
Get vs Post • 아래 해당사항은 전부 OR 로 이해하길 바람. • Get • 전달하고 싶은 내용이 짧다.(ex :page_number) • 사용자가 알아도 상관없고, 임의로 요청해도 상관이 없다. • Post • 전달하고 싶은 내용이 길다.(ex :글쓰기 요청을 할 때 글 내용,File) • 사용자가 임의로 조작하면 안된다. • 사용자게에 들키고 싶지 않다.(비밀번호)
Json • JSON (JavaScript Object Notation)은 경량의 DATA-교환 형식이다. 이 형식은 사람이 읽고 쓰기에 용이하며, 기계가 분석하고 생성함에도 용이하다. • XML과 비슷하다. • 그냥 단순히 데이터를 텍스트를 주고받을 때 쓰는 약속이다.
Json Example 위 : Json, 아래 : XML
Json • 모르겠으면 그냥 그런가보다 하세요 • 이번 세미나만큼은 주입식 교육..
server setting • 제가 간단한 서버를 만들어 두었습니다. • http request • http://bit.sparcs.org:20220/get_list • Get • parameter • None • 모든 사람의 이름의 리스트를 리턴한다. • http://bit.sparcs.org:20220/get_person • Get • parameter • name : 찾을 사람의 이름 • 해당 이름을 가진 사람의 자세한 정보를 리턴한다.
server setting • http://bit.sparcs.org:20220/add_person • Post • parameter • name : 새로 만들 사람의 이름 • author : 작성자 이름 • description : 설명 • 새로운 사람을 server의 DB에 추가한다.
Stream • 이게 참.. 설명하기가 힘드네 • I/O라는거 알죠? • Input, Output • input과 output이 필요한곳이 정말 많아요 • Input : 마우스, 키보드,File, Network Connection • output :모니터, 프린터,File, Network Connection • 그런데 이 수많은 I/O들을 하나하나 다루려면 정말 어렵겠죠 모니터 따로, 프린터 따로,File 따로 Network 따로..
Stream • 그래서 Java가 참 고맙게도 Stream이라는 것으로 추상화를 해줘서 우린 프린터든 모니터든 File이든 뭐든간에 그냥 Stream을 쓰면 됩니다.
Stream • Stream은 빨대에요 • 콜라잔에 빨대를 꼽고, 내입에도 콜라를 물고있다고 해봅시다. • 빨대는 빨기 전용 빨대와 좀 드럽지만 내뱉기 전용 빨대 두가지가 있어요.(InputStream, OutputStream) • 빨대에 양쪽끝에 뭐가 연결되있든 상관이 없어요 • 잔대신 페트병이 있어도 되고 접시가 있어도 되요 • 주둥이대신 콧구멍이 있어도 되고 펌프가 있어도되요
Stream • Stream은 종류도 드럽게많아요 생각나는 것만 몇개 적으면(output stream은 똑같으니까 생략) • BufferedInputStream • data를 Buffer에 모아서 한번에 읽을 수 있어요 • 1kb를 읽는데 1byte씩 1000번 읽는 것 보다 100byte씩 10번만 읽는게 훨씬 빠르겠죠? • Network 연결에서 유용하게 사용 되겠죠? • FileInputStream • File이름을 주면 File을 읽게해줘요 • PipedInputStream • 뒤에서 Thread에 대해 배울텐데,2개의 Thread사이의 통신을 할 수 있어요 • 이외에도 드럽게 많음
Stream • 그런데 참 걱정인게 Buffer를 써서 File을 읽고싶으면 어떻게 해야할까요? • BufferedInputStream을 써야할까요 FIleInputSream을 써야 할까요? • 그래서 Stream은 Decorator pattern 이라는 design pattern을 이용해요 • 크리스마스 장식을 하는데 꼭 별만 달거나 전구만 달 필요 없죠 • 별도 달고 전구도 달고 솜도 달고 이것저것 다 달면 좋잖아요
Stream • Stream도 크리스마스 트리처럼 Buffer도 달고 File도 달고 Piped도 달고 할수 있어요 • 어떻게? • 이렇게 • new BufferedInputStrean(new FileInputStream(“filename”)); • 겹겹이 몇개든 씌울 수 있어요
Thread • Process 내에서 실행되는 흐름의 단위 • MultiThreading이라고 많이 들어봤죠?
Thread in Android • Main Thread • 우리가 지금까지 쓰던게 다 Main Thread입니다. • Main Thread는 정말 중요한 임무가 하나 있는데 • 바로 “View를 만드는 일!” 을합니다. • 인터넷에 연결해 Response를 받는 일은 긴 시간이 걸립니다. • Main Thread에서 인터넷에 연결하는 작업을 실행하면 어떻게될까요? • Main Thread가 그사이에View를 만들 수 없어서 화면이 Freezing 된다.
Thread in Android • 그래서 Android는 Main Thread에서 인터넷 연결을 하는 것을 금지하고 있습니다.(하면 Exception) • 그럼 어떻게 해야 할까요? • 다른 Thread를 만들고 그 Thread에서 돌리자
Thread in Android • 그런데 문제가 또있어요 동시에 실행되는 여러개의 Thread가 전부다 View를 컨트롤(움직이거나, 텍스트를 바꾸거나, 색을 바꾸거나..)하면 무슨일이 생길까요? • Concurrency 문제가 생길 확률이 크다! • 뭔말인지 모르겠으면 그냥 얘기치 못한 오류가 생긴다고 알고있으세요 • 그래서 Android는 Main Thread만 View를 컨트롤 할 수 있습니다.
Android • 본격적으로 만들어보자
Android • 오늘부턴 코드를 제공하므로 따라칠 필요가 없습니다. • 대신 미묘하게 알파벳을 뒤섞이거나, 추가하거나, 제거해둘테니 고쳐서 쓰세요 • 자동완성을 이용하셔야 잘 고칠 수 있습니다.
AndroidMenifest.xml • Internet을 쓰려면 권한이 필요하다. • <uses-permission android:name="android.permission.INTERNET"/> • (붙여서)uses-sdk아래에 작성
version 1 • 작성순서 • activity_main.xml • Person.java • NetworkManager.java • MainActivity.java
What Are We Doing? • NetworManager.java • enum? INSTANCE? 이상해요.. 이게뭐죠.. • enum을 이용해 Singleton pattern을 구현한 것이다. • instance가 1개만 존재해야할 때 사용된다. • 뭔지 잘 모르겠으면 그냥 따라서 치자.. 첫부분 빼고는 다 똑같다. • setDoInput,setDoOutput • 연결된 http connection에서 input과 output을 사용할지 말지를 결정한다.Get방식은 input만 사용하면 되고,Post는 input과 output을 모두 사용해야 한다. • 솔직히 이것들은 너무 복잡해서 PPT로 설명하긴 너무 어렵다. • 나중에 PPT만 보고 공부하게 될 후배들에겐 미안하지만 그냥 말로설명하겠다.
What Are We Doing? • MainActivity.java • CustomAdapter는 귀찮아서 안쓰겠다.(원래는 쓰는게 자연스러움) • ListActivity는 뭔가요? • Activity를 상속하는 클래스이다. • ListView가 Activity에 들어있을 때 간편하게 다룰 수 있도록 getListView(), setListAdapter()같은 다양한 메소드를 제공한다. • 대신 xml에 @android:id/list를 가진 ListView가 존재해야 runtime Error가 안난다.
What Are We Doing? • Thread가 어떻게 작동하는 건가요? • 1.Thread는 constructor가 parameter로 Runnable Instance를 받는다. • Thread Instance 의 start(); method로 Thread Instance를 만들 때 받은 Runnable Instance의 run() method를 실행시킬 수 있다. • Thread Instance의 start()을 실행하는 순간 Main Thread와 방금 만든 Thread두개가 동시에 실행된다. • 따라서 Main Thread가 Network Connection에 매달릴 필요가 없기때문에 화면이 Freezing 되지 않는다.
What Are We Doing? • post method는 뭔가요? • Thread 내에서 View에 관련된 일을 하는 것은 금지되어있고, 반드시 Main Thread만 View에 관련된 일을 해야한다. • View.post(Runnable runnable) method를 통해서 MainThread의 작업 Queue에 할일을 넣어줄 수 있다. • listview에 adapter를 달아 주는 일은 Main Thread에서만 실행할 수 있기 때문에 postmethod로 넘겨주었다.
실행해보자 • 부자연스러운 점이 있다. 왜일까? • 로딩바가 없어서! • 로딩바를 만들어보자
version 2 • 다음 순서로 작업하자 • activity_main.xml • MainActivity.java
develop, develop • 이름을 클릭하면 자세한 설명이 나오도록 해보자.
version 3 • 다음 순서로 • detail.xml • DetailActivity.java • MainActivity.java
AndroidMenifest.xml • Activity 추가
develop, develop • 이제 사람을 추가해보자
version 4 • 작성 순서 • xml들 • AddActivity.java • MainActivity.java
What are we doing? • MainActivity부분은 저번시간에 설명한 적이 있는 startActivityForResult를 사용하였다. • OnActivityResult에서 Result_OK신호가 도착했을 때,List를 Refresh해주기 위해서 다시 Thread를 이용한다.
What are we doing? • AddActivity.java • 저번시간에 한 것과 비슷하다. • Add버튼을 누르면 Network Request를 통해 server의 db에 새로운 Person을 등록하고 result를 설정한다.
The End • 끝! • 하지만..
모르면 개발 “절대” 못하는 것들 • Fragment • GCM(push, Notification) • Widget • Using Library • DataBase
Homework • 그래서 준비했습니다 Homework • 1~3명씩 조를 짜서 다음 다섯가지 주제 중 하나를 선택하여, 그 주제를 활용한 어플리케이션을 만들어오세요 • 간단해도 됩니다. 코드 한줄한줄을 제대로 설명만 할 수 있으면!
Homework • 다음 다섯가지 주제들은 정말로 모르면 개발 할 수 있는게 별로 없습니다. 기껏해야 이상형 리스트정도? • 이 외에도 알아야 할 것이 태산이고, 그 대부분은 혼자 공부해야 합니다. • 기간은 다음주 화요일 까지입니다. • 다음 시간은 각각의 팀이 만든 어플리케이션을 그 팀이 주제와 함께 간단히 설명하겠습니다.
Homework • 꼴지팀은 매점을 쏴야 합니다.
주제 • Fragment • ex : 탭 구현하기 • 카카오톡이 친구, 채팅, 친구찾기, 더보기 4개의 탭을 가진 것 처럼 • GCM(push, Notification) • ex : device 등록, 해지하고 푸쉬 보내기. • Widget • ex :D-day 계산기
주제 • Using Library • 2개이상 사용! • git hub에서 slidingmenu, endless adapter, color picker같은 다양한 라이브러리 사용해보기 • DataBase • 주소록 만들어보기 • 삽입, 제거, 수정, 그룹 기능 필요
The End • 다음주 화요일에 봅시다!