SlideShare a Scribd company logo
1 of 203
Download to read offline
Day
 8.
 (네트워크
 상태에)
  
독립된
 안드로이드
 서비스
 만들기
학습목표 
• 네크워크가 불안정한 상태에서 동작하는 앱을 만들자! 
• LocalStorage를 이용해서 서비스로 자동 동기화 시키자 
• 다른 앱도 우리의 데이터를 사용할수 있게 공개하자 
• 주기적으로 데이터가 들어오면 화면도 재갱신되게 만들자
이전까지의 상황
현재 Article을 받아오는 방법 
스마트폰 
서버 
1. Homeview Activity가 Resume될 때 
2. ActionBar의 refresh버튼을 누를 때
현재 APP 구조 
Server 
Activity 
database 
Proxy 
Dao
현재 APP 구조 
Server 
Activity 
database 
Proxy 
Dao 
버튼을 클릭했을때
현재 APP 구조 
Server 
Activity 
database 
Proxy 
Dao 
1. Proxy에게 요청을 보낸다.
현재 APP 구조 
Server 
Activity 
database 
Proxy 
Dao 
2. Proxy가 서버에게 요청을 보낸다
현재 APP 구조 
Server 
Activity 
database 
Proxy 
Dao 
3. 서버가 Proxy에게 json데이터를 
전달한다.
현재 APP 구조 
Server 
Activity 
database 
Proxy 
Dao 
4. Proxy가 Activity에게 
json데이터를 전달한다.
현재 APP 구조 
Server 
Activity 
database 
Proxy 
Dao 
5. Activity가 Dao에게 
json데이터를 전달한다.
현재 APP 구조 
Server 
Activity 
database 
Proxy 
Dao 
5. Dao가 json데이터를 
DB에 저장한다.
내부 동작 
Proxy.getJson() 
Dao.insertJsonData() 
Homview.refreshData() 
1. Homeview Activity의 onResume()에서 
2. ActionBar의 refresh버튼을 누를 때
현재처럼 Refresh를 누를때마다 데이터를 가져오는게 아니라
Server 
Activity 
database 
Proxy 
Dao 
주기적으로 데이터를 전달받을 수 없을까?
section 1 
Service 
백그라운드에서
 계속
 돌다!
주기적으로 서버로부터 최신데이터를 받아와서 
업데이트 할 수 있는 어플리케이션을 
만들어 보겠습니다.
Android Service 
Service는 백그라운드에서 긴 기간동안 수행해야하는 연산을 하는 컴포넌트 
사용자와 상호작용을 제공하지 않는 컴포넌트를 구현할때 사용 
예) 네트워크 연산, 음악 재생, I/O 연산 수행, content provider와 상호작용 과 같은 모든 백그라운드 연산
Service의 두가지 형태 
STARTED BOUND 
Activity같은 Component에서 
startService() 메서드를 통해 시작할때 
Component에서 bindService()메서드를 
통해 시작할때 
• 백그라운드에서 실행되기 때문에 호출한 
컴포넌트가 사라져도 실행됨 
• caller에게 결과값을 리턴하지 않음 
• 보통 한개의 연산을 수행할때 사용 
• Client - Serivce 인터페이스 제공(send 
request, get results, IPC) 
• Bind 되어있을 동안 서비스가 계속 살아 
있음. Bind 되어있는 서비스가 0개가 되 
었을때 서비스가 죽음
Service의 두가지 형태 
STARTED BOUND 
Activity같은 Component에서 
startService() 메서드를 통해 시작할때 
우리는 STARTED만 다룸 
Component에서 bindService()메서드를 
통해 시작할때 
• 백그라운드에서 실행되기 때문에 호출한 
컴포넌트가 사라져도 실행됨 
• caller에게 결과값을 리턴하지 않음 
• 보통 한개의 연산을 수행할때 사용 
• Client - Serivce 인터페이스 제공(send 
request, get results, IPC) 
• Bind 되어있을 동안 서비스가 계속 살아 
있음. Bind 되어있는 서비스가 0개가 되 
었을때 서비스가 죽음
Android Service 구현하기 
1. Service를 상속받는 SyncDataService 클래스를 하나 생성합니다. 
2. Service를 사용하기 위해 AndroidManifest.xml에 코드를 추가합니다. 
3. Service를 위해 필요한 메서드를 구현합니다
Android Service LifeCycle
Service Class 생성 
• Service를 상속받는 클래스 SyncDataService를 생성합니다.
Android Manifest 파일 수정 
구조 예시 
Service 클래스를 상속받은 SyncDataService를 등록 
• Android에서 Service를 사용하기 위해선 AndroidManifest.xml 파일에 등록을 해주어야 합니다. 
• application 태그 안에 넣어야 합니다.
구현해야할 메서드 추가 
SyncDataService에서 코드를 Override 합니다
구현해야할 메서드 추가 
SyncDataService에서 코드를 Override 합니다 
• onCreate() : Service가 생성되었을 때 실행. 
• onDestroy() : Service가 종료되었을 때 실행. 
• onStartCommand() : 다른 컴포넌트에서 
startService를 통해 시작했을때 실행.
구현해야할 메서드 추가 
SyncDataService에서 코드를 Override 합니다 
• onCreate() : Service가 생성되었을 때 실행. 
• onDestroy() : Service가 종료되었을 때 실행. 
• onStartCommand() : 다른 컴포넌트에서 
startService를 통해 시작했을때 실행. 
앞으로 이 3개의 메서드를 구현함으로써 기능을 완성시키겠습니다.
Service를 실행시키기(1) 
AndroidManifest.xml 
암시적 인텐트를 활용하기 위해 intent-filter 태그를 추가합니다
Service를 실행시키기(2) 
HomeView.java 
Service가 실행되기 원하는 시점에 위의 코드를 추가해주도록 합니다. 
ex) HomeView의 onCreate()
Service를 실행시키기(3) 
SyncDataService.java 
실행이 되었는지 확인하기 위해서 로그를 남기도록 합니다.
Article을 주기적으로 가져오자 
TimerTask 클래스와 Timer 클래스를 활용해 반복적인 작업을 실행하는 코드를 작성할 것입니다.
Article을 주기적으로 가져오자(1) 
Timer 
본 예제에선 Timer(String name)을 활용하겠습니다.
Article을 주기적으로 가져오자(2) 
Timer의 메서드 
…http://developer.android.com/reference/java/util/Timer.html 
• schedule 메서드는 TimerTask (원하는 작업), 시작하기 원하는 때, 주기를 인자로 받아 
작업을 수행합니다. 
• 본 예제에선 schedule(TimerTask task, long delay, long period)를 활용하겠습니다.
Article을 주기적으로 가져오자(3) 
TimerTask 
Runnable을 implements 하기 때문에 run() 메서드를 오버 
라이드 해줍니다.
Article을 주기적으로 가져오자(3) 
TimerTask 
Runnable을 implements 하기 때문에 run() 메서드를 오버 
라이드 해줍니다. 
생성자도 하나, 메서드도 3개를 지원하는 단순한 클래스 입니다.
Article을 주기적으로 가져오자(4) 
SyncDataService.java 
TimerTask와 Timer 클래스를 활용해 주기적으로 메서드를 실행시키도록 합니다. 
주기적으로 Log.i(TAGm “Hello”); 가 출력되는지 확인합니다.
Service에서 Article 저장하기 
이전에 작성한 TimerTask class의 run()을 구현하여 Article을 저장해봅시다.
Service에서 Article 저장하기(1) 
Service와 Timer가 정상작동 하는것을 확인하였으니 이제 Article을 받아오는 로직을 
추가하도록 합시다. 
Proxy.getJson() 
Dao.insertJsonData() 
Article을 받아오는 메서드
Service에서 Article 저장하기(2) 
SyncDataService.java 
Proxy, Dao 인스턴스 생성을 위한 변수를 선언합니다.
Service에서 Article 저장하기(3) 
SyncDataService.java 
Proxy와 Dao에게 Application Context를 넘겨주고 생성합니다. 
Proxy와 Dao 클래스 내부에서 Application Context가 필요한 메서드가 있었습니다.
Service에서 Article 저장하기(3) 
SyncDataService.java 
Proxy.getJson() 
TimerTask의 run() 메서드 안에 를 추가해 줍니다. 
Dao.insertJsonD 
ata()
Server 
Activity 
database 
Proxy 
Dao 
Service 
Service는 주기적으로 요청을 보냅니다.
section 1 
Service 
백그라운드에서
 계속
 돌다! 
마무리
우린 주기적으로 데이터를 
받아올 수 있는 서비스를 구현했습니다 
Service에 로그를 찍어 확인해 봅시다!
section 2 
Content Provider 
다른
 어플리케이션에게
 
  
내
 앱의
 정보를
 공유하다
Activity 
Dao 
database 
다른앱에 우리의 
데이터를 제공하고 싶다면?
Activity 
Dao 
database 
다른앱에 우리의 
데이터를 제공하고 싶다면? 
데이터가 저장되었을때 화면을 
자동으로 재갱신하고 싶다면?
Activity 
Dao 
database 
다른앱에 우리의 
데이터를 제공하고 싶다면? 
데이터가 저장되었을때 화면을 
자동으로 재갱신하고 싶다면? 
데이터를 핸들링하는 
템플릿을 유지하고 싶다면?
Content Provider의 역할 
• 데이터 집합에 접근 
• Data를 캡슐화 하고, Data의 보안을 위한 메커니즘을 제공 
• 한 프로세스안의 데이터에 다른 프로세스가 접근하기 위한 표준 인터페이스
Content Provider 
Content Provider를 사용하기 위해 알아야할 클래스들 
(1). ContentProvider 
(2). ContentResolver 
(3). Cursor 
(4). Uri 
Database에 접근 
ContentProvider에 접근 Application이 데이터를 쉽게 핸들링 
Resolver를 통해 얻어온 데이터를 조회 
컨텐츠를 구분할 수 있는 식별자 
전화번호부, DB.. 등등
Content Provider 
동작 방식 
Application ContentResolver 
ContentProvider 
DataBase 
Application 
1 
URI 
Application이 자신의 Resolver에게 데이터를 요청
Content Provider 
Application ContentResolver 
ContentProvider 
DataBase 
Application 
ContentResolver가 URI에 적합한 어플리케이션의 
ContentProvider를 찾아 데이터 요청 
2 
URI 
동작 방식
Content Provider 
Application ContentResolver 
ContentProvider 
DataBase 
Application 
ContentProvider는 Resolver가 요청한 데이터를 
Database에서 찾음 
3 
URI 
동작 방식
Content Provider 
Application ContentResolver 
ContentProvider 
DataBase 
Application 
Cursor 
4 
ContentProvider가 Resolver에게 데이터를 반환하고 
Resolver는 데이터를 요청한 Application에게 Cursor 객체로 
데이터를 반환 
동작 방식
Content Provider 특징 
URI 
Application ContentResolver 
ContentProvider 
DataBase 
Application 
Cursor 
1. ContentResolver 객체는 Provider 객체와 동일한 메서드를 갖는다. 
ContentResolver.query() 메서드는 ContentProvider.query()의 메서드를 호출 
2. ContentResolver 객체는 Create, Retrieve, Update, Delete (CRUD)를 제공함
Content Provider 학습순서 
URI 
Application ContentResolver 
ContentProvider 
DataBase 
Application 
Cursor 
1. Application에서 Content Resolver를 사용하는방법 
ContentResolver를 통해 ContentProvider에 접근할 수 있어야 한다
Content Provider 학습순서 
URI 
Application ContentResolver 
ContentProvider 
DataBase 
Application 
Cursor 
2. Content Provider를 제작하는 방법 
Custom Content Provider를 만들어 다른 어플리케이션에 인터페이스를 제공할 수 있어야 한다
ContentProvider에 접근해보자 
ContentResolver의 메서드를 알아보고 
메서드를 사용하기 위해 알아야할 개념들을 학습하자!
ContentResolver의 메서드 
ContentProvider 
query() Provider를 통해 데이터를 전달받기 위한 함수 (Cursor 반환) 
insert() Provider를 통해 데이터를 삽입함. (새로 삽입된 row의 URI를 반환) 
update() Provider를 통해 데이터를 업데이트함. (업데이트된 로우의 개수를 반환) 
delete() Provider를 통해 데이터를 삭제함. (삭제된 로우의 개수를 반환) 
…. (더 있지만 우선 위의것이 기본)
ContentResolver의 메서드 
ContentProvider 
query() Provider를 통해 데이터를 전달받기 위한 함수 (Cursor 반환) 
insert() Provider를 통해 데이터를 삽입함. (새로 삽입된 row의 URI를 반환) 
update() Provider를 통해 데이터를 업데이트함. (업데이트된 로우의 개수를 반 
환) 
query()를 먼저 알아봄으로써 
Content URI, Cursor 등 필요한 
개념에 대해서 알아 봅시다. 
delete() Provider를 통해 데이터를 삭제함. (삭제된 로우의 개수를 반환) 
…. (더 있지만 우선 위의것이 기본)
百聞不如一見 
연락처를 받아오는 App을 만들자 
Android 는 사용자 핸드폰에 저장된 연락처에 접근할 수 있는 
Content Provider 를 이미 제공하고 있습니다. 
따라서 우리는 그 연락처 Provider에 접근하는 Resolver 를 만들어 
1. Application에서 Content Resolver를 사용하는방법 
ContentResolver를 통해 ContentProvider에 접근할 수 있어야 한다 
위의 퀘스트를 달성하겠습니다. 
연락처 Provider : http://developer.android.com/reference/android/provider/ContactsContract.Contacts.html
새로운 프로젝트 생성
만들 메서드 2개! 
1. Cursor getContactCursor () 
ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후 
데이터 Cursor를 반환하는 메서드 
2. void printLogContactData (Cursor contactData) 
contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드
만들 메서드 2개! 
1. Cursor getContactCursor () 
ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후 
데이터 Cursor를 반환하는 메서드 
2. void printLogContactData (Cursor contactData) 
contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 Cursor는 뭔데?
Cursor란 무엇일까요.
Cursor란 무엇일까요. 
d.android는 말합니다.
Cursor란 무엇일까요. 
d.android는 말합니다. 
(웅장하게) 
Database query로 부터 반환된 결과에 접근하는 인터페이스라고..
Android 내부로 들어가봅시다.
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
Cursor란 무엇일까요? 
Application 
DB야 데이터좀 줄래?! (query) DB
Cursor란 무엇일까요? 
Application 
DB 
Data 
자. 데이터!
Cursor란 무엇일까요? 
DB 
Data 
Application 
사용하기 너무 불편해ㅠㅠ
Cursor란 무엇일까요? 
DB 
Application 
Cursor 
Data 
Cursor 객체를 통해 
데이터를 사용하자 
Cursor에 대한 더 자세한 정보 : http://developer.android.com/reference/android/database/Cursor.html
Manifest파일에 권한 추가
getContactCursor 구현(1) 
ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 
함수를 작성합니다. 
Mac기준 : command + shift + o 를 눌러 Import하지 않은 클래스를 Import
getContactCursor 구현(2) 
ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 
Uri contactURI 는 Provider의 데이터를 식별하기 위한 URI 입니다. 
ContactsContract.Contacts.CONTENT_URI 는 연락처 정보 테이블의 위치를 의미합니다.
getContactCursor 구현(3) 
ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 
————— 
다양한 정보를 제공 
Projection 은 Provider로 부터 획득하고 싶은 정보를 서술합니다.
getContactCursor 구현(4) 
ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 
getContentResolver() 를 통해 Resolver 객체를 획득한 후 
query() 메서드를 사용합니다.
getContactCursor 구현(4) 
ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 
getContentResolver() 를 통해 Resolver 객체를 획득한 후 
query() 메서드를 사용합니다. 
SQL query 와 비교해서 좀 더 자세히 설명하겠습니다.
getContactCursor 구현(4) 
ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 
query() 인자값 SELECT 비고 
Uri FROM table_name Uri 는 provider의 테이블에 접근하는 정보 
projection col, col, col, … 반환받길 원하는 col을 서술한다. 
selection 
WHERE col = value 
WHERE 뒤에 오는 문장을 표현한다. 
변수는 ? 로서 표현 
selectionArgs selection의 ?에 매칭되어 값이 전달된다 
sortOrder Order By col, col… sortOrder 에 따라서 Cursor가 정렬되어 
반환됨
getContactCursor 구현(5) 
ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 
null일 경우 연결 실패 
.query(contactURI, projection, null, null, Contacts.DISPLAY_NAME+” asc”); 
SELECT _ID, display_name FROM contacts ORDER BY display_name ASC;
만들 메서드 2개! 
1. Cursor getContactCursor () 
ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후 
데이터 Cursor를 반환하는 메서드 
2. void printLogContactData (Cursor contactData) 
contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드
printLogContactData 구현(1) 
contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 
id와 displayName의 인덱스 정보를 저장할 변수를 선언합니다.
printLogContactData 구현(1) 
contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 
null일 경우 연결 실패 
Cursor가 null일 경우 연결이 실패한 경우입니다.
printLogContactData 구현(1) 
contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 
Cursor의 getCount() 메서드를 활용해 크기를 구합니다 
결과값의 개수가 0개일 경우도 처리해 줍니다.
printLogContactData 구현(1) 
contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 
1. idIndex와 displayNameIndex의 값을 구합니다. 
2. 로그에 결과를 출력합니다. 
나머지 경우에 원하는 코드를 작성해 주도록 합시다.
printLogContactData 구현(1) 
contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 
getColumnIndex()을 통해 id와 displayName의 인덱스를 구합니다.
printLogContactData 구현(1) 
contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 
moveToNext() 메서드를 통해 결과값에 접근하도록 합니다.
printLogContactData 구현(1) 
contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 
getLong(), getString() 메서드를 통해 Cursor로부터 데이터를 회수합니다.
결과 
연락처에있는 모든 목록을 가져와 출력합니다.
1. Cursor getContactCursor () 
2. void printLogContactData (Cursor contactData) 
메서드를 만들어 봄으로써 
1. Application에서 Content Resolver를 사용하는방법 
ContentResolver를 통해 ContentProvider에 접근할 수 있어야 한다 
을 학습했습니다
Content Provider 만들어 보기 
Custom Content Provider를 만들어 다른 어플리케이션에 인터페이스를 제공할 수 있어야 한다
Content Provider를 만들기 전에 
• Content Provider가 정말 필요한지 생각해보자 
필요한 경우 
1. 다른 어플리케이션에게 복잡한 데이터, file을 제공하길 원한다면. 
2. 사용자가 당신의 앱에서 다른 앱으로 복잡한 데이터를 복사하길 원한다면. 
3. Search Framework를 사용해서 custom search를 제공하길 원한다면. 
• 이미 제공하는 Provider가 있을경우 굳이 만들지 말자 
Calendar, Contacts 같이 이미 제공하는 Provider들을 찾아보자
Content Provider 만들기 순서 
• NextgramProvider를 만들자. 
• Dao를 분리하기 
• Contract Class 만들기 
• Content Provider 상속구현하기
• Dao를 분리하기 
현재 있는 Dao.java를 복사해 ProviderDao.java를 만듭니다.
• Dao를 분리하기 
클래스이름과 생성자이름을 수정해 에러를 제거합니다.
• Dao를 분리하기 
• 현재 NEXTGRAM의 DAO클래스는 충실한 DAO클래스 일까? 
아니다! 
1. Database에 접근하는 역할, 데이터를 Mashaling, Unmashaling하는 역할 
등 여러가지 역할을 동시에 가지고 있다.
따라서! 
Database와 연동 
json데이터 객체화 
등등…. 
하게 분리하겠습니다. 
• Dao를 분리하기 
Dao.java 
ProviderDao.java 
NextgramProvider.java
• Dao를 분리하기 
NextgramProvider라는 이름의 새로운 클래스를 생성합니다.
• Dao를 분리하기 
• Content Provider를 상속받습니다. 
• unimplemented methods를 
구현하도록 합니다 
onCreate 
query 
getType 
insert 
delete 
update
• Dao를 분리하기 
NextgramProvider 에게 필요한 기능을 ProviderDao로부터 복사해옵니다. 
Database와 통신하기 위한 
• sqLiteInitialize 
• tableCreate 
• isTableExist 
NextgramProvider.java
• Dao를 분리하기 
NextgramProvider.java 
NextgramProvider 에게 필요한 변수를 생성해 줍니다.
• Dao를 분리하기 
NextgramProvider.java 
NextgramProvider의 onCreate를 구현합니다.
• Contract Class 만들기 
• Contract class는 Content Provider에서 필요한 상수값을 지정해두는 클래스입니다. 
• 외부의 어플리케이션에서 Provider를 사용하기 위해 필요한 값들이 지정되어 있습니다. 
연락처 Provider의 Contract class 사용 예제
• Contract Class 만들기 
NextgramContract 라는 public final class 를 만들어 줍시다
• Contract Class 만들기 
NextgramContract.java 
NextgramContract 에 AUTHORITY, CONTENT_URI에 대한 정보를 입력합니다.
잠깐! 
Content URI, Authority?!
Content URI를 디자인하자 
• Content URI는 provider안의 데이터를 식별하는 URI이다. 
• Provider의 이름을 의미하는 Authority와 테이블이나 파일을 의미하는 
Path로 구성되어 있다. 
Content URI 
Authority + Path
Content URI를 디자인하자 
Authority는 다른 프로바이더와 충돌을 피하기 위해 “Android 패키지 이름 + 앱이름” 을 추천한다 
Content URI 
Authority + Path 
org.nhnnext.nextgram.provider/table1 
예시 :
Content URI를 디자인하자 
Content URI 패턴 
content://org.nhnnext.nextgram.provider/table1 
content://org.nhnnext.nextgram.provider/table2/dataset1 
content://org.nhnnext.nextgram.provider/table2/dataset2 
content://org.nhnnext.nextgram.provider/table3 
table1을 요청. 
dataset1이라 불리는 table을 요청 
dataset2라 불리는 table을 요청 
table3을 요청함. 
URI를 통해 테이블에 접근 
URI를 통해 각 열에 접근 
content://org.nhnnext.nextgram.provider/table1/1 table1을 요청. 
테이블 URI : content://authority/path 
한 열의 URI : content://authority/path/id 
#은 모든 숫자에 매칭 
*은 모든 숫자, 문자에 매칭
• Contract Class 만들기 
NextgramContract.java 
Inner class로 BaseColumns를 상속받은 Articles 클래스를 작성합니다.
• Contract Class 만들기 
NextgramContract.java 
테이블의 컬럼속성인 _ID, TITLE, WRITER, ID, CONTENT, WRITER_DATE, IMAGE_NAME와 
매치되는 변수를 선언합니다.
• Contract Class 만들기 
NextgramContract.java 
Articles 테이블의 아이템에 연결되는 CONTENT_URI를 작성합니다.
• Contract Class 만들기 
NextgramContract.java 
PROJECTION_ALL에 대한 정보를 작성해 둡니다.
• Contract Class 만들기 
NextgramContract.java 
기본적인 정렬은 _ID를 기준으로 하도록 합니다.
• Contract Class 만들기 
이렇게 만들어진 Contract Class는 Provider에 접근하기 위한 API라고 
생각하면 편합니다. 
다음으론 NextgramProvider의 
onCreate 
query 
getType 
insert 
delete 
update
• Contract Class 만들기 
이렇게 만들어진 Contract Class는 Provider에 접근하기 위한 API라고 
생각하면 편합니다. 
다음으론 NextgramProvider의 
onCreate 
query 
getType 
insert 
delete 
update 
MIME TYPE을 지원하지 않음. 
아직 기능이 없음 
아직 기능이 없음
• Contract Class 만들기 
이렇게 만들어진 Contract Class는 Provider에 접근하기 위한 API라고 
생각하면 편합니다. 
다음으론 NextgramProvider의 
onCreate 
query 
insert 
를 구현하겠습니다.
• Content Provider 상속구현하기 
Android Manifest 파일안에 
manifest 안에 위의 퍼미션과 
Provider가 지정되어야 합니다.
• Content Provider 상속구현하기 
NextgramProvider.java 
query, insert에서 사용할 URI정보를 관리할 Uri Matcher 객체를 생성합니다.
• Content Provider 상속구현하기 
NextgramContract.java 
Resolver를 통해 요청이 들어올때 
“org.nhnnext.nextgram.provider/Articles”는 1 (ARTICLE_LIST) 처리 
“org.nhnnext.nextgram.provider/Articles/#”는 2 (ARTICLE_ID) 처리
• Content Provider 상속구현하기 
다음으로 insert를 구현하겠습니다.
• Content Provider 상속구현하기 
처음보는 ContentValues가 나왔습니다. 
나중에 설명해 드릴게요! 
NextgramProvider.java
• Content Provider 상속구현하기 
NextgramProvider.java
• Content Provider 상속구현하기 
NextgramProvider.java
• Content Provider 상속구현하기 
NextgramProvider.java
• Content Provider 상속구현하기 
insert는 구현이 완료되었으니 query를 구현하겠습니다.
• Content Provider 상속구현하기 
NextgramProvider.java 
Uri uri 객체를 통해 원하는 요청이 무엇인지 검사합니다.
• Content Provider 상속구현하기 
NextgramProvider.java 
URI가 “org.nhnnext.nextgram.provider” 일때 
URI_MATCHER의 match()는 ARTICLE_LIST(1)을 반환합니다.
• Content Provider 상속구현하기 
NextgramProvider.java 
NextgramContract.java 
sortOrder값이 없다면 _ID를 기준으로 정렬합니다.
• Content Provider 상속구현하기 
NextgramProvider.java 
ARTICLE_ID 일 때에는 한개의 게시글을 가져오도록 코드를 작성합니다.
• Content Provider 상속구현하기 
ARTICLE_LIST, ARTICLE_ID 등 다양한 Uri에 대해 값들을 준비한 후 
Database에 Query를 보내봅시다.
• Content Provider 상속구현하기 
NextgramProvider.java 
요기에 작성!
• Content Provider 상속구현하기 
NextgramProvider.java 
database.query를 통해 
Table, projection, selection, selectionArgs, sortOrder를 지정하고 
query를 보냅니다.
• Content Provider 상속구현하기 
NextgramProvider.java 
반환된 cursor를 return 해주면 완료!
• Content Provider 상속구현하기 
NextgramProvider.java의 insert, query를 구현 했으니 
ProviderDao.java를 수정하도록 하겠습니다.
• Content Provider 상속구현하기 
ProviderDao.java의 
• sqLiteInitialize 
• tableCreate 
• isTableExist 
메서드를 제거해 줍니다. 
Database와 직접 연결하는것은 NextgramProvider의 역할입니다.
• Content Provider 상속구현하기 
ProviderDao.java의 
• insertJsonData 
• getArticleList 
• getArticle 
insert 
메서드를 수정할 겁니다. 
query
• Content Provider 상속구현하기 
1. insertJsonData 수정
• Content Provider 상속구현하기 
기존 Dao.java에서는 database에 직접 insert하는 쿼리에 
컬럼의 값들을 직접 붙여 날리는 방법을 사용했습니다. 
하지만 ContentResolver를 이용하면 database에 직접 접근할 
수 없으므로 컬럼 값들을 ContentValues에 담아 전달해야 합니다.
• Content Provider 상속구현하기 
ContentValues 
공식 레퍼런스 
백문이 불여일견
• Content Provider 상속구현하기 
(기존) Dao.java - insertJsonData 메서드 
(insert 쿼리를 만들어 database에 날림) 
Database에 직접 접근하던 코드를 
Resolver를 통해 Provider를 사용하도록 수정합니다
• Content Provider 상속구현하기 
(수정) ProviderDao.java - insertJsonData 메서드 
(각 컬럼의 값들을 ContentValues의 객체인 values에 담아 전달) 
Database에 직접 접근하던 코드를 
Resolver를 통해 Provider를 사용하도록 수정합니다
• Content Provider 상속구현하기 
2. getArticleList 수정
• Content Provider 상속구현하기 
ProviderDao.java Dao.java 
getArticleList 메서드 틀린 그림 찾기
• Content Provider 상속구현하기 
Dao.java 
ProviderDao.java
• Content Provider 상속구현하기 
ProviderDao.java 
Dao.java
• Content Provider 상속구현하기 
2. getArticleByArticleNumber 수정
• Content Provider 상속구현하기 
ProviderDao.java Dao.java 
getArticleByArticleNumber 메서드 틀린 그림 찾기
• Content Provider 상속구현하기 
Dao.java 
ProviderDao.java
section 2 
Content Provider 
다른
 어플리케이션에게
 
  
내
 앱의
 정보를
 공유하다 
마무리
Server 
변경된 앱의 구조 
Activity 
ProviderDao 
database 
Proxy 
Service 
Content Provider를 통해 DB에 접근할 
수 있게 됬습니다. 
Content Provider
Activity 
Dao 
database 
다른앱에 우리의 
데이터를 제공하고 싶다면? 
데이터가 저장되었을때 화면을 
자동으로 재갱신하고 싶다면? 
데이터를 핸들링하는 
템플릿을 유지하고 싶다면?
Activity 
Dao 
database 
다른앱에 우리의 
데이터를 제공하고 싶다면? 
데이터가 저장되었을때 화면을 
자동으로 재갱신하고 싶다면? 
데이터를 핸들링하는 
템플릿을 유지하고 싶다면?
Activity 
Dao 
database 
다른앱에 우리의 
데이터를 제공하고 싶다면? 
데이터가 저장되었을때 화면을 
자동으로 재갱신하고 싶다면? 
데이터를 핸들링하는 
템플릿을 유지하고 싶다면?
Activity 
Dao 
database 
다른앱에 우리의 
데이터를 제공하고 싶다면? 
데이터가 저장되었을때 화면을 
자동으로 재갱신하고 싶다면? 
데이터를 핸들링하는 
템플릿을 유지하고 싶다면?
데이터가 저장되었을때 화면을 
자동으로 재갱신하고 싶다면?
section 3 
Cursor Adapter 
데이터가
 삽입되면
 화면에
 자동으로
 
  
재갱신됩니다
데이터가 저장되었을때 화면을 
자동으로 재갱신하고 싶다면? 
HomeViewAdapter를 CursorAdpater로 변경하자
HomeView 변경 
HomView.java 
Cursor Adapter는 데이터를 가져올때마다 갱신할 필요가 없습니다. 
위의 주석처리된 부분을 삭제해주도록 합니다.
HomeView 변경 
HomView.java 
위의 명령을 onCreate의 마지막 부분에 추가해주도록 합니다. 
이제, listViewSimple1()을 변경해야 합니다.
HomeView 변경 
HomView.java 
CursorAdapter로 사용하기 위해 코드를 변경합니다. 
HomeViewAdapter는 context, cursor, layout 파일을 인자로 받습니다.
CursorAdapter를 만들기 위해 HomeView는 준비를 끝냈으니 
ArrayAdapter를 상속받은 HomeViewAdapter를 수정하도록 합니다.
CursorAdapter 변경 
CursorAdapter.java 
CursorAdapter를 상속받도록 변경합니다.
CursorAdapter 변경 
CursorAdapter.java 
1. Context, Cursor, XML layoutID를 받도록 생성자를 변경합니다. 
2. LayoutInflater도 미리 생성해두도록 합니다.
CursorAdapter 변경 
CursorAdapter.java 
CursorAdapter를 상속받으면 newView, bindView를 구현해야합니다. 
이 둘은 기존의 getView의 기능을 분리해 둔 것입니다. 
getView 메서드는 지우도록합니다
newView, bindView 
newView는 처음 view가 생성될때 실행됩니다. 
bindView는 이미 뷰가 생성되어있으면 실행합니다.
newView, bindView를 구현하기 전에!
ViewHolder Pattern 
기존의 HomeViewAdapter.java의 getView() 
Adapter를 갱신할때마다 findViewById()를 사용해 성능이 저하되는것을 
막기 위해 ViewHolder Pattern을 사용하도록 하겠습니다. 
View객체를 재사용하기 위한 목적
CursorAdapter 변경 
CursorAdapter.java 
CursorAdapter.java안에 ViewHolderItem 클래스를 작성합니다. 
다음슬라이드부터 적극적으로 활용됩니다.
CursorAdapter 변경 
CursorAdapter.java 
xml파일로부터 inflate한 View를 만들어 줍니다. 
반환을 위한 목적의 뷰입니다.
CursorAdapter 변경 
CursorAdapter.java 
ViewHolderItem 객체를 생성합니다.

More Related Content

What's hot

안드로이드 오픈소스 그리고 패턴
안드로이드 오픈소스 그리고 패턴  안드로이드 오픈소스 그리고 패턴
안드로이드 오픈소스 그리고 패턴 YoungSu Son
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게Sungju Jin
 
5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivityJinKyoungHeo
 
React 튜토리얼 2차시
React 튜토리얼 2차시React 튜토리얼 2차시
React 튜토리얼 2차시태현 김
 
안드로이드 오픈소스 패턴 - 0.1
안드로이드 오픈소스 패턴 - 0.1안드로이드 오픈소스 패턴 - 0.1
안드로이드 오픈소스 패턴 - 0.1YoungSu Son
 
React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작Taegon Kim
 
스프링 3.0 RESTful & restTemplate
스프링 3.0  RESTful & restTemplate스프링 3.0  RESTful & restTemplate
스프링 3.0 RESTful & restTemplateisyoon
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발NAVER D2
 
ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는Taegon Kim
 
Json view 예제 설명
Json view 예제 설명Json view 예제 설명
Json view 예제 설명Hyung Eun Jin
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수NAVER D2
 
GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기
 GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기 GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기
GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기Kenneth Ceyer
 
[KGIT_EWD]class03 0322
[KGIT_EWD]class03 0322[KGIT_EWD]class03 0322
[KGIT_EWD]class03 0322jylee6977
 
F3 네이버오픈api만드는매쉬업
F3 네이버오픈api만드는매쉬업F3 네이버오픈api만드는매쉬업
F3 네이버오픈api만드는매쉬업NAVER D2
 
Jurano강의 lec1. AndroidAnnotations 시작하기
Jurano강의 lec1. AndroidAnnotations 시작하기Jurano강의 lec1. AndroidAnnotations 시작하기
Jurano강의 lec1. AndroidAnnotations 시작하기Ju-ri Seo
 

What's hot (19)

안드로이드 오픈소스 그리고 패턴
안드로이드 오픈소스 그리고 패턴  안드로이드 오픈소스 그리고 패턴
안드로이드 오픈소스 그리고 패턴
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
 
5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivity
 
React 튜토리얼 2차시
React 튜토리얼 2차시React 튜토리얼 2차시
React 튜토리얼 2차시
 
4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 
안드로이드 오픈소스 패턴 - 0.1
안드로이드 오픈소스 패턴 - 0.1안드로이드 오픈소스 패턴 - 0.1
안드로이드 오픈소스 패턴 - 0.1
 
React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작
 
스프링 3.0 RESTful & restTemplate
스프링 3.0  RESTful & restTemplate스프링 3.0  RESTful & restTemplate
스프링 3.0 RESTful & restTemplate
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발
 
ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는
 
Json view 예제 설명
Json view 예제 설명Json view 예제 설명
Json view 예제 설명
 
Meteor2015 codelab
Meteor2015 codelab Meteor2015 codelab
Meteor2015 codelab
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수
 
GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기
 GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기 GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기
GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기
 
[KGIT_EWD]class03 0322
[KGIT_EWD]class03 0322[KGIT_EWD]class03 0322
[KGIT_EWD]class03 0322
 
Spring boot DI
Spring boot DISpring boot DI
Spring boot DI
 
F3 네이버오픈api만드는매쉬업
F3 네이버오픈api만드는매쉬업F3 네이버오픈api만드는매쉬업
F3 네이버오픈api만드는매쉬업
 
Jurano강의 lec1. AndroidAnnotations 시작하기
Jurano강의 lec1. AndroidAnnotations 시작하기Jurano강의 lec1. AndroidAnnotations 시작하기
Jurano강의 lec1. AndroidAnnotations 시작하기
 
[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초
 

Viewers also liked

오픈소스 Jedis 리펙토링 하기 (redis java 라이브러리)
오픈소스 Jedis 리펙토링 하기 (redis java 라이브러리) 오픈소스 Jedis 리펙토링 하기 (redis java 라이브러리)
오픈소스 Jedis 리펙토링 하기 (redis java 라이브러리) YoungSu Son
 
안드로이드 오픈소스 어플리케이션 블록 2
안드로이드 오픈소스 어플리케이션 블록 2안드로이드 오픈소스 어플리케이션 블록 2
안드로이드 오픈소스 어플리케이션 블록 2YoungSu Son
 
[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)
[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)
[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)YoungSu Son
 
[NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기 [NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기 YoungSu Son
 
[NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 [NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 YoungSu Son
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기) YoungSu Son
 
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)YoungSu Son
 
SW 아키텍처 분석방법
SW 아키텍처 분석방법 SW 아키텍처 분석방법
SW 아키텍처 분석방법 YoungSu Son
 

Viewers also liked (8)

오픈소스 Jedis 리펙토링 하기 (redis java 라이브러리)
오픈소스 Jedis 리펙토링 하기 (redis java 라이브러리) 오픈소스 Jedis 리펙토링 하기 (redis java 라이브러리)
오픈소스 Jedis 리펙토링 하기 (redis java 라이브러리)
 
안드로이드 오픈소스 어플리케이션 블록 2
안드로이드 오픈소스 어플리케이션 블록 2안드로이드 오픈소스 어플리케이션 블록 2
안드로이드 오픈소스 어플리케이션 블록 2
 
[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)
[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)
[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)
 
[NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기 [NEXT] Flask 로 Restful API 서버 만들기
[NEXT] Flask 로 Restful API 서버 만들기
 
[NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 [NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
 
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
 
SW 아키텍처 분석방법
SW 아키텍처 분석방법 SW 아키텍처 분석방법
SW 아키텍처 분석방법
 

Similar to [NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경

React native development
React native developmentReact native development
React native developmentSangSun Park
 
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)Sang Don Kim
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드중선 곽
 
Mirantis open stack deployment automation
Mirantis open stack deployment automationMirantis open stack deployment automation
Mirantis open stack deployment automationWooKyun Jeon
 
안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API
안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API
안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API Gosu Ok
 
Androidpn guide-0.5.0-ko
Androidpn guide-0.5.0-koAndroidpn guide-0.5.0-ko
Androidpn guide-0.5.0-kosandeepreddyp42
 
AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇
AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇
AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇Amazon Web Services Korea
 
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Wangeun Lee
 
Google Firebase로 레고블럭 조립하기 - IO Extended 2016
Google Firebase로 레고블럭 조립하기 - IO Extended 2016Google Firebase로 레고블럭 조립하기 - IO Extended 2016
Google Firebase로 레고블럭 조립하기 - IO Extended 2016Chiung Choi
 
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017Amazon Web Services Korea
 
Metaworks3 Framework workbook 2015
Metaworks3 Framework workbook 2015Metaworks3 Framework workbook 2015
Metaworks3 Framework workbook 2015uEngine Solutions
 
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함 메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함 uEngine Solutions
 
안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기YoungSu Son
 
Progressive Web App(PWA) 테코톡 발표자료 - 마르코(장원석)
Progressive Web App(PWA) 테코톡 발표자료 - 마르코(장원석)Progressive Web App(PWA) 테코톡 발표자료 - 마르코(장원석)
Progressive Web App(PWA) 테코톡 발표자료 - 마르코(장원석)Wonseok Jang
 
Android ContentProvider Adapter Activity Relation
Android ContentProvider Adapter Activity RelationAndroid ContentProvider Adapter Activity Relation
Android ContentProvider Adapter Activity Relation동우 김
 
Jurano강의 lec2. sample application 둘러보기
Jurano강의 lec2. sample application 둘러보기Jurano강의 lec2. sample application 둘러보기
Jurano강의 lec2. sample application 둘러보기Ju-ri Seo
 

Similar to [NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경 (20)

Spring portfolio2
Spring portfolio2Spring portfolio2
Spring portfolio2
 
React native development
React native developmentReact native development
React native development
 
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드
 
Mirantis open stack deployment automation
Mirantis open stack deployment automationMirantis open stack deployment automation
Mirantis open stack deployment automation
 
안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API
안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API 안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API
안드로이드 OAuth 1.0a, 2.0 구현 - Naver, Google API
 
Androidpn guide-0.5.0-ko
Androidpn guide-0.5.0-koAndroidpn guide-0.5.0-ko
Androidpn guide-0.5.0-ko
 
AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇
AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇
AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇
 
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계
 
Google Firebase로 레고블럭 조립하기 - IO Extended 2016
Google Firebase로 레고블럭 조립하기 - IO Extended 2016Google Firebase로 레고블럭 조립하기 - IO Extended 2016
Google Firebase로 레고블럭 조립하기 - IO Extended 2016
 
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
 
모바일을 위한 (AWS) 클라우드 기술 동향
모바일을 위한 (AWS) 클라우드 기술 동향 모바일을 위한 (AWS) 클라우드 기술 동향
모바일을 위한 (AWS) 클라우드 기술 동향
 
Metaworks3 Framework workbook 2015
Metaworks3 Framework workbook 2015Metaworks3 Framework workbook 2015
Metaworks3 Framework workbook 2015
 
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함 메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함
 
안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기
 
Progressive Web App(PWA) 테코톡 발표자료 - 마르코(장원석)
Progressive Web App(PWA) 테코톡 발표자료 - 마르코(장원석)Progressive Web App(PWA) 테코톡 발표자료 - 마르코(장원석)
Progressive Web App(PWA) 테코톡 발표자료 - 마르코(장원석)
 
Portfolio
PortfolioPortfolio
Portfolio
 
Android ContentProvider Adapter Activity Relation
Android ContentProvider Adapter Activity RelationAndroid ContentProvider Adapter Activity Relation
Android ContentProvider Adapter Activity Relation
 
Jurano강의 lec2. sample application 둘러보기
Jurano강의 lec2. sample application 둘러보기Jurano강의 lec2. sample application 둘러보기
Jurano강의 lec2. sample application 둘러보기
 
Light Tutorial Django
Light Tutorial DjangoLight Tutorial Django
Light Tutorial Django
 

More from YoungSu Son

Fault Tolerance 패턴
Fault Tolerance 패턴 Fault Tolerance 패턴
Fault Tolerance 패턴 YoungSu Son
 
Clean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance TuningClean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance TuningYoungSu Son
 
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화YoungSu Son
 
Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭) Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭) YoungSu Son
 
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)YoungSu Son
 
Singleton 패턴 (김진영 - EVA, 소마에 10기)
Singleton 패턴 (김진영 -  EVA, 소마에 10기) Singleton 패턴 (김진영 -  EVA, 소마에 10기)
Singleton 패턴 (김진영 - EVA, 소마에 10기) YoungSu Son
 
실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 YoungSu Son
 
생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기) 생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기) YoungSu Son
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 YoungSu Son
 
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심) DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심) YoungSu Son
 
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101) 모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101) YoungSu Son
 
DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법 DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법 YoungSu Son
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기YoungSu Son
 
Android 성능 지표와 Oreo 의 개선사항
Android 성능 지표와  Oreo 의 개선사항 Android 성능 지표와  Oreo 의 개선사항
Android 성능 지표와 Oreo 의 개선사항 YoungSu Son
 
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법YoungSu Son
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기YoungSu Son
 
Android Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + GenymotionAndroid Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + GenymotionYoungSu Son
 
URQA 삼성 컨퍼런스 발표
URQA 삼성 컨퍼런스 발표 URQA 삼성 컨퍼런스 발표
URQA 삼성 컨퍼런스 발표 YoungSu Son
 
[NEXT] Nextgram Refactoring
[NEXT] Nextgram Refactoring[NEXT] Nextgram Refactoring
[NEXT] Nextgram RefactoringYoungSu Son
 
[NEXT] Android Profiler
[NEXT] Android Profiler[NEXT] Android Profiler
[NEXT] Android ProfilerYoungSu Son
 

More from YoungSu Son (20)

Fault Tolerance 패턴
Fault Tolerance 패턴 Fault Tolerance 패턴
Fault Tolerance 패턴
 
Clean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance TuningClean Code, Software Architecture, Performance Tuning
Clean Code, Software Architecture, Performance Tuning
 
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
인공지능 식별추적시스템 실증랩 구축및 운영 - 평가모델 고도화
 
Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭) Prototype 패턴 (심만섭)
Prototype 패턴 (심만섭)
 
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
Chain of Responsibility (심수연 - 소프트웨어 마에스트로 10기)
 
Singleton 패턴 (김진영 - EVA, 소마에 10기)
Singleton 패턴 (김진영 -  EVA, 소마에 10기) Singleton 패턴 (김진영 -  EVA, 소마에 10기)
Singleton 패턴 (김진영 - EVA, 소마에 10기)
 
실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우 실전 서버 부하테스트 노하우
실전 서버 부하테스트 노하우
 
생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기) 생성 패턴 (강태우 - 소마에 10기)
생성 패턴 (강태우 - 소마에 10기)
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드
 
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심) DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
DevOps 오픈소스 트랜드 (클라우드, 모바일 중심)
 
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101) 모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
모바일 앱 성능 분석 방법 101 (Mobile Application Performance Analysis Methodology 101)
 
DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법 DevOps 시대가 요구하는 품질확보 방법
DevOps 시대가 요구하는 품질확보 방법
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기
 
Android 성능 지표와 Oreo 의 개선사항
Android 성능 지표와  Oreo 의 개선사항 Android 성능 지표와  Oreo 의 개선사항
Android 성능 지표와 Oreo 의 개선사항
 
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법안드로이드 Oreo의 변화와  모바일 앱/플랫폼의 적합한 성능 측정 방법
안드로이드 Oreo의 변화와 모바일 앱/플랫폼의 적합한 성능 측정 방법
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
 
Android Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + GenymotionAndroid Studio 개발 셋팅 + Genymotion
Android Studio 개발 셋팅 + Genymotion
 
URQA 삼성 컨퍼런스 발표
URQA 삼성 컨퍼런스 발표 URQA 삼성 컨퍼런스 발표
URQA 삼성 컨퍼런스 발표
 
[NEXT] Nextgram Refactoring
[NEXT] Nextgram Refactoring[NEXT] Nextgram Refactoring
[NEXT] Nextgram Refactoring
 
[NEXT] Android Profiler
[NEXT] Android Profiler[NEXT] Android Profiler
[NEXT] Android Profiler
 

[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경

  • 1. Day
  • 9. 학습목표 • 네크워크가 불안정한 상태에서 동작하는 앱을 만들자! • LocalStorage를 이용해서 서비스로 자동 동기화 시키자 • 다른 앱도 우리의 데이터를 사용할수 있게 공개하자 • 주기적으로 데이터가 들어오면 화면도 재갱신되게 만들자
  • 11. 현재 Article을 받아오는 방법 스마트폰 서버 1. Homeview Activity가 Resume될 때 2. ActionBar의 refresh버튼을 누를 때
  • 12. 현재 APP 구조 Server Activity database Proxy Dao
  • 13. 현재 APP 구조 Server Activity database Proxy Dao 버튼을 클릭했을때
  • 14. 현재 APP 구조 Server Activity database Proxy Dao 1. Proxy에게 요청을 보낸다.
  • 15. 현재 APP 구조 Server Activity database Proxy Dao 2. Proxy가 서버에게 요청을 보낸다
  • 16. 현재 APP 구조 Server Activity database Proxy Dao 3. 서버가 Proxy에게 json데이터를 전달한다.
  • 17. 현재 APP 구조 Server Activity database Proxy Dao 4. Proxy가 Activity에게 json데이터를 전달한다.
  • 18. 현재 APP 구조 Server Activity database Proxy Dao 5. Activity가 Dao에게 json데이터를 전달한다.
  • 19. 현재 APP 구조 Server Activity database Proxy Dao 5. Dao가 json데이터를 DB에 저장한다.
  • 20. 내부 동작 Proxy.getJson() Dao.insertJsonData() Homview.refreshData() 1. Homeview Activity의 onResume()에서 2. ActionBar의 refresh버튼을 누를 때
  • 21. 현재처럼 Refresh를 누를때마다 데이터를 가져오는게 아니라
  • 22. Server Activity database Proxy Dao 주기적으로 데이터를 전달받을 수 없을까?
  • 23. section 1 Service 백그라운드에서
  • 26. 주기적으로 서버로부터 최신데이터를 받아와서 업데이트 할 수 있는 어플리케이션을 만들어 보겠습니다.
  • 27. Android Service Service는 백그라운드에서 긴 기간동안 수행해야하는 연산을 하는 컴포넌트 사용자와 상호작용을 제공하지 않는 컴포넌트를 구현할때 사용 예) 네트워크 연산, 음악 재생, I/O 연산 수행, content provider와 상호작용 과 같은 모든 백그라운드 연산
  • 28. Service의 두가지 형태 STARTED BOUND Activity같은 Component에서 startService() 메서드를 통해 시작할때 Component에서 bindService()메서드를 통해 시작할때 • 백그라운드에서 실행되기 때문에 호출한 컴포넌트가 사라져도 실행됨 • caller에게 결과값을 리턴하지 않음 • 보통 한개의 연산을 수행할때 사용 • Client - Serivce 인터페이스 제공(send request, get results, IPC) • Bind 되어있을 동안 서비스가 계속 살아 있음. Bind 되어있는 서비스가 0개가 되 었을때 서비스가 죽음
  • 29. Service의 두가지 형태 STARTED BOUND Activity같은 Component에서 startService() 메서드를 통해 시작할때 우리는 STARTED만 다룸 Component에서 bindService()메서드를 통해 시작할때 • 백그라운드에서 실행되기 때문에 호출한 컴포넌트가 사라져도 실행됨 • caller에게 결과값을 리턴하지 않음 • 보통 한개의 연산을 수행할때 사용 • Client - Serivce 인터페이스 제공(send request, get results, IPC) • Bind 되어있을 동안 서비스가 계속 살아 있음. Bind 되어있는 서비스가 0개가 되 었을때 서비스가 죽음
  • 30. Android Service 구현하기 1. Service를 상속받는 SyncDataService 클래스를 하나 생성합니다. 2. Service를 사용하기 위해 AndroidManifest.xml에 코드를 추가합니다. 3. Service를 위해 필요한 메서드를 구현합니다
  • 32. Service Class 생성 • Service를 상속받는 클래스 SyncDataService를 생성합니다.
  • 33. Android Manifest 파일 수정 구조 예시 Service 클래스를 상속받은 SyncDataService를 등록 • Android에서 Service를 사용하기 위해선 AndroidManifest.xml 파일에 등록을 해주어야 합니다. • application 태그 안에 넣어야 합니다.
  • 34. 구현해야할 메서드 추가 SyncDataService에서 코드를 Override 합니다
  • 35. 구현해야할 메서드 추가 SyncDataService에서 코드를 Override 합니다 • onCreate() : Service가 생성되었을 때 실행. • onDestroy() : Service가 종료되었을 때 실행. • onStartCommand() : 다른 컴포넌트에서 startService를 통해 시작했을때 실행.
  • 36. 구현해야할 메서드 추가 SyncDataService에서 코드를 Override 합니다 • onCreate() : Service가 생성되었을 때 실행. • onDestroy() : Service가 종료되었을 때 실행. • onStartCommand() : 다른 컴포넌트에서 startService를 통해 시작했을때 실행. 앞으로 이 3개의 메서드를 구현함으로써 기능을 완성시키겠습니다.
  • 37. Service를 실행시키기(1) AndroidManifest.xml 암시적 인텐트를 활용하기 위해 intent-filter 태그를 추가합니다
  • 38. Service를 실행시키기(2) HomeView.java Service가 실행되기 원하는 시점에 위의 코드를 추가해주도록 합니다. ex) HomeView의 onCreate()
  • 39. Service를 실행시키기(3) SyncDataService.java 실행이 되었는지 확인하기 위해서 로그를 남기도록 합니다.
  • 40. Article을 주기적으로 가져오자 TimerTask 클래스와 Timer 클래스를 활용해 반복적인 작업을 실행하는 코드를 작성할 것입니다.
  • 41. Article을 주기적으로 가져오자(1) Timer 본 예제에선 Timer(String name)을 활용하겠습니다.
  • 42. Article을 주기적으로 가져오자(2) Timer의 메서드 …http://developer.android.com/reference/java/util/Timer.html • schedule 메서드는 TimerTask (원하는 작업), 시작하기 원하는 때, 주기를 인자로 받아 작업을 수행합니다. • 본 예제에선 schedule(TimerTask task, long delay, long period)를 활용하겠습니다.
  • 43. Article을 주기적으로 가져오자(3) TimerTask Runnable을 implements 하기 때문에 run() 메서드를 오버 라이드 해줍니다.
  • 44. Article을 주기적으로 가져오자(3) TimerTask Runnable을 implements 하기 때문에 run() 메서드를 오버 라이드 해줍니다. 생성자도 하나, 메서드도 3개를 지원하는 단순한 클래스 입니다.
  • 45. Article을 주기적으로 가져오자(4) SyncDataService.java TimerTask와 Timer 클래스를 활용해 주기적으로 메서드를 실행시키도록 합니다. 주기적으로 Log.i(TAGm “Hello”); 가 출력되는지 확인합니다.
  • 46. Service에서 Article 저장하기 이전에 작성한 TimerTask class의 run()을 구현하여 Article을 저장해봅시다.
  • 47. Service에서 Article 저장하기(1) Service와 Timer가 정상작동 하는것을 확인하였으니 이제 Article을 받아오는 로직을 추가하도록 합시다. Proxy.getJson() Dao.insertJsonData() Article을 받아오는 메서드
  • 48. Service에서 Article 저장하기(2) SyncDataService.java Proxy, Dao 인스턴스 생성을 위한 변수를 선언합니다.
  • 49. Service에서 Article 저장하기(3) SyncDataService.java Proxy와 Dao에게 Application Context를 넘겨주고 생성합니다. Proxy와 Dao 클래스 내부에서 Application Context가 필요한 메서드가 있었습니다.
  • 50. Service에서 Article 저장하기(3) SyncDataService.java Proxy.getJson() TimerTask의 run() 메서드 안에 를 추가해 줍니다. Dao.insertJsonD ata()
  • 51. Server Activity database Proxy Dao Service Service는 주기적으로 요청을 보냅니다.
  • 52. section 1 Service 백그라운드에서
  • 55. 우린 주기적으로 데이터를 받아올 수 있는 서비스를 구현했습니다 Service에 로그를 찍어 확인해 봅시다!
  • 56. section 2 Content Provider 다른
  • 58.  
  • 63. Activity Dao database 다른앱에 우리의 데이터를 제공하고 싶다면?
  • 64. Activity Dao database 다른앱에 우리의 데이터를 제공하고 싶다면? 데이터가 저장되었을때 화면을 자동으로 재갱신하고 싶다면?
  • 65. Activity Dao database 다른앱에 우리의 데이터를 제공하고 싶다면? 데이터가 저장되었을때 화면을 자동으로 재갱신하고 싶다면? 데이터를 핸들링하는 템플릿을 유지하고 싶다면?
  • 66. Content Provider의 역할 • 데이터 집합에 접근 • Data를 캡슐화 하고, Data의 보안을 위한 메커니즘을 제공 • 한 프로세스안의 데이터에 다른 프로세스가 접근하기 위한 표준 인터페이스
  • 67. Content Provider Content Provider를 사용하기 위해 알아야할 클래스들 (1). ContentProvider (2). ContentResolver (3). Cursor (4). Uri Database에 접근 ContentProvider에 접근 Application이 데이터를 쉽게 핸들링 Resolver를 통해 얻어온 데이터를 조회 컨텐츠를 구분할 수 있는 식별자 전화번호부, DB.. 등등
  • 68. Content Provider 동작 방식 Application ContentResolver ContentProvider DataBase Application 1 URI Application이 자신의 Resolver에게 데이터를 요청
  • 69. Content Provider Application ContentResolver ContentProvider DataBase Application ContentResolver가 URI에 적합한 어플리케이션의 ContentProvider를 찾아 데이터 요청 2 URI 동작 방식
  • 70. Content Provider Application ContentResolver ContentProvider DataBase Application ContentProvider는 Resolver가 요청한 데이터를 Database에서 찾음 3 URI 동작 방식
  • 71. Content Provider Application ContentResolver ContentProvider DataBase Application Cursor 4 ContentProvider가 Resolver에게 데이터를 반환하고 Resolver는 데이터를 요청한 Application에게 Cursor 객체로 데이터를 반환 동작 방식
  • 72. Content Provider 특징 URI Application ContentResolver ContentProvider DataBase Application Cursor 1. ContentResolver 객체는 Provider 객체와 동일한 메서드를 갖는다. ContentResolver.query() 메서드는 ContentProvider.query()의 메서드를 호출 2. ContentResolver 객체는 Create, Retrieve, Update, Delete (CRUD)를 제공함
  • 73. Content Provider 학습순서 URI Application ContentResolver ContentProvider DataBase Application Cursor 1. Application에서 Content Resolver를 사용하는방법 ContentResolver를 통해 ContentProvider에 접근할 수 있어야 한다
  • 74. Content Provider 학습순서 URI Application ContentResolver ContentProvider DataBase Application Cursor 2. Content Provider를 제작하는 방법 Custom Content Provider를 만들어 다른 어플리케이션에 인터페이스를 제공할 수 있어야 한다
  • 75. ContentProvider에 접근해보자 ContentResolver의 메서드를 알아보고 메서드를 사용하기 위해 알아야할 개념들을 학습하자!
  • 76. ContentResolver의 메서드 ContentProvider query() Provider를 통해 데이터를 전달받기 위한 함수 (Cursor 반환) insert() Provider를 통해 데이터를 삽입함. (새로 삽입된 row의 URI를 반환) update() Provider를 통해 데이터를 업데이트함. (업데이트된 로우의 개수를 반환) delete() Provider를 통해 데이터를 삭제함. (삭제된 로우의 개수를 반환) …. (더 있지만 우선 위의것이 기본)
  • 77. ContentResolver의 메서드 ContentProvider query() Provider를 통해 데이터를 전달받기 위한 함수 (Cursor 반환) insert() Provider를 통해 데이터를 삽입함. (새로 삽입된 row의 URI를 반환) update() Provider를 통해 데이터를 업데이트함. (업데이트된 로우의 개수를 반 환) query()를 먼저 알아봄으로써 Content URI, Cursor 등 필요한 개념에 대해서 알아 봅시다. delete() Provider를 통해 데이터를 삭제함. (삭제된 로우의 개수를 반환) …. (더 있지만 우선 위의것이 기본)
  • 78. 百聞不如一見 연락처를 받아오는 App을 만들자 Android 는 사용자 핸드폰에 저장된 연락처에 접근할 수 있는 Content Provider 를 이미 제공하고 있습니다. 따라서 우리는 그 연락처 Provider에 접근하는 Resolver 를 만들어 1. Application에서 Content Resolver를 사용하는방법 ContentResolver를 통해 ContentProvider에 접근할 수 있어야 한다 위의 퀘스트를 달성하겠습니다. 연락처 Provider : http://developer.android.com/reference/android/provider/ContactsContract.Contacts.html
  • 80. 만들 메서드 2개! 1. Cursor getContactCursor () ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후 데이터 Cursor를 반환하는 메서드 2. void printLogContactData (Cursor contactData) contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드
  • 81. 만들 메서드 2개! 1. Cursor getContactCursor () ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후 데이터 Cursor를 반환하는 메서드 2. void printLogContactData (Cursor contactData) contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 Cursor는 뭔데?
  • 84. Cursor란 무엇일까요. d.android는 말합니다. (웅장하게) Database query로 부터 반환된 결과에 접근하는 인터페이스라고..
  • 90. Cursor란 무엇일까요? Application DB야 데이터좀 줄래?! (query) DB
  • 91. Cursor란 무엇일까요? Application DB Data 자. 데이터!
  • 92. Cursor란 무엇일까요? DB Data Application 사용하기 너무 불편해ㅠㅠ
  • 93. Cursor란 무엇일까요? DB Application Cursor Data Cursor 객체를 통해 데이터를 사용하자 Cursor에 대한 더 자세한 정보 : http://developer.android.com/reference/android/database/Cursor.html
  • 95. getContactCursor 구현(1) ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 함수를 작성합니다. Mac기준 : command + shift + o 를 눌러 Import하지 않은 클래스를 Import
  • 96. getContactCursor 구현(2) ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 Uri contactURI 는 Provider의 데이터를 식별하기 위한 URI 입니다. ContactsContract.Contacts.CONTENT_URI 는 연락처 정보 테이블의 위치를 의미합니다.
  • 97. getContactCursor 구현(3) ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 ————— 다양한 정보를 제공 Projection 은 Provider로 부터 획득하고 싶은 정보를 서술합니다.
  • 98. getContactCursor 구현(4) ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 getContentResolver() 를 통해 Resolver 객체를 획득한 후 query() 메서드를 사용합니다.
  • 99. getContactCursor 구현(4) ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 getContentResolver() 를 통해 Resolver 객체를 획득한 후 query() 메서드를 사용합니다. SQL query 와 비교해서 좀 더 자세히 설명하겠습니다.
  • 100. getContactCursor 구현(4) ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 query() 인자값 SELECT 비고 Uri FROM table_name Uri 는 provider의 테이블에 접근하는 정보 projection col, col, col, … 반환받길 원하는 col을 서술한다. selection WHERE col = value WHERE 뒤에 오는 문장을 표현한다. 변수는 ? 로서 표현 selectionArgs selection의 ?에 매칭되어 값이 전달된다 sortOrder Order By col, col… sortOrder 에 따라서 Cursor가 정렬되어 반환됨
  • 101. getContactCursor 구현(5) ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후, 데이터 Cursor를 반환하는 메서드 null일 경우 연결 실패 .query(contactURI, projection, null, null, Contacts.DISPLAY_NAME+” asc”); SELECT _ID, display_name FROM contacts ORDER BY display_name ASC;
  • 102. 만들 메서드 2개! 1. Cursor getContactCursor () ContentResolver를 통해 연락처 Provider에 데이터를 요청한 후 데이터 Cursor를 반환하는 메서드 2. void printLogContactData (Cursor contactData) contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드
  • 103. printLogContactData 구현(1) contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 id와 displayName의 인덱스 정보를 저장할 변수를 선언합니다.
  • 104. printLogContactData 구현(1) contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 null일 경우 연결 실패 Cursor가 null일 경우 연결이 실패한 경우입니다.
  • 105. printLogContactData 구현(1) contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 Cursor의 getCount() 메서드를 활용해 크기를 구합니다 결과값의 개수가 0개일 경우도 처리해 줍니다.
  • 106. printLogContactData 구현(1) contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 1. idIndex와 displayNameIndex의 값을 구합니다. 2. 로그에 결과를 출력합니다. 나머지 경우에 원하는 코드를 작성해 주도록 합시다.
  • 107. printLogContactData 구현(1) contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 getColumnIndex()을 통해 id와 displayName의 인덱스를 구합니다.
  • 108. printLogContactData 구현(1) contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 moveToNext() 메서드를 통해 결과값에 접근하도록 합니다.
  • 109. printLogContactData 구현(1) contentProvider로 부터 Cursor형태로 넘어온 데이터를 Log에 출력하는 메서드 getLong(), getString() 메서드를 통해 Cursor로부터 데이터를 회수합니다.
  • 110. 결과 연락처에있는 모든 목록을 가져와 출력합니다.
  • 111. 1. Cursor getContactCursor () 2. void printLogContactData (Cursor contactData) 메서드를 만들어 봄으로써 1. Application에서 Content Resolver를 사용하는방법 ContentResolver를 통해 ContentProvider에 접근할 수 있어야 한다 을 학습했습니다
  • 112. Content Provider 만들어 보기 Custom Content Provider를 만들어 다른 어플리케이션에 인터페이스를 제공할 수 있어야 한다
  • 113. Content Provider를 만들기 전에 • Content Provider가 정말 필요한지 생각해보자 필요한 경우 1. 다른 어플리케이션에게 복잡한 데이터, file을 제공하길 원한다면. 2. 사용자가 당신의 앱에서 다른 앱으로 복잡한 데이터를 복사하길 원한다면. 3. Search Framework를 사용해서 custom search를 제공하길 원한다면. • 이미 제공하는 Provider가 있을경우 굳이 만들지 말자 Calendar, Contacts 같이 이미 제공하는 Provider들을 찾아보자
  • 114. Content Provider 만들기 순서 • NextgramProvider를 만들자. • Dao를 분리하기 • Contract Class 만들기 • Content Provider 상속구현하기
  • 115. • Dao를 분리하기 현재 있는 Dao.java를 복사해 ProviderDao.java를 만듭니다.
  • 116. • Dao를 분리하기 클래스이름과 생성자이름을 수정해 에러를 제거합니다.
  • 117. • Dao를 분리하기 • 현재 NEXTGRAM의 DAO클래스는 충실한 DAO클래스 일까? 아니다! 1. Database에 접근하는 역할, 데이터를 Mashaling, Unmashaling하는 역할 등 여러가지 역할을 동시에 가지고 있다.
  • 118. 따라서! Database와 연동 json데이터 객체화 등등…. 하게 분리하겠습니다. • Dao를 분리하기 Dao.java ProviderDao.java NextgramProvider.java
  • 119. • Dao를 분리하기 NextgramProvider라는 이름의 새로운 클래스를 생성합니다.
  • 120. • Dao를 분리하기 • Content Provider를 상속받습니다. • unimplemented methods를 구현하도록 합니다 onCreate query getType insert delete update
  • 121. • Dao를 분리하기 NextgramProvider 에게 필요한 기능을 ProviderDao로부터 복사해옵니다. Database와 통신하기 위한 • sqLiteInitialize • tableCreate • isTableExist NextgramProvider.java
  • 122. • Dao를 분리하기 NextgramProvider.java NextgramProvider 에게 필요한 변수를 생성해 줍니다.
  • 123. • Dao를 분리하기 NextgramProvider.java NextgramProvider의 onCreate를 구현합니다.
  • 124. • Contract Class 만들기 • Contract class는 Content Provider에서 필요한 상수값을 지정해두는 클래스입니다. • 외부의 어플리케이션에서 Provider를 사용하기 위해 필요한 값들이 지정되어 있습니다. 연락처 Provider의 Contract class 사용 예제
  • 125. • Contract Class 만들기 NextgramContract 라는 public final class 를 만들어 줍시다
  • 126. • Contract Class 만들기 NextgramContract.java NextgramContract 에 AUTHORITY, CONTENT_URI에 대한 정보를 입력합니다.
  • 127. 잠깐! Content URI, Authority?!
  • 128. Content URI를 디자인하자 • Content URI는 provider안의 데이터를 식별하는 URI이다. • Provider의 이름을 의미하는 Authority와 테이블이나 파일을 의미하는 Path로 구성되어 있다. Content URI Authority + Path
  • 129. Content URI를 디자인하자 Authority는 다른 프로바이더와 충돌을 피하기 위해 “Android 패키지 이름 + 앱이름” 을 추천한다 Content URI Authority + Path org.nhnnext.nextgram.provider/table1 예시 :
  • 130. Content URI를 디자인하자 Content URI 패턴 content://org.nhnnext.nextgram.provider/table1 content://org.nhnnext.nextgram.provider/table2/dataset1 content://org.nhnnext.nextgram.provider/table2/dataset2 content://org.nhnnext.nextgram.provider/table3 table1을 요청. dataset1이라 불리는 table을 요청 dataset2라 불리는 table을 요청 table3을 요청함. URI를 통해 테이블에 접근 URI를 통해 각 열에 접근 content://org.nhnnext.nextgram.provider/table1/1 table1을 요청. 테이블 URI : content://authority/path 한 열의 URI : content://authority/path/id #은 모든 숫자에 매칭 *은 모든 숫자, 문자에 매칭
  • 131. • Contract Class 만들기 NextgramContract.java Inner class로 BaseColumns를 상속받은 Articles 클래스를 작성합니다.
  • 132. • Contract Class 만들기 NextgramContract.java 테이블의 컬럼속성인 _ID, TITLE, WRITER, ID, CONTENT, WRITER_DATE, IMAGE_NAME와 매치되는 변수를 선언합니다.
  • 133. • Contract Class 만들기 NextgramContract.java Articles 테이블의 아이템에 연결되는 CONTENT_URI를 작성합니다.
  • 134. • Contract Class 만들기 NextgramContract.java PROJECTION_ALL에 대한 정보를 작성해 둡니다.
  • 135. • Contract Class 만들기 NextgramContract.java 기본적인 정렬은 _ID를 기준으로 하도록 합니다.
  • 136. • Contract Class 만들기 이렇게 만들어진 Contract Class는 Provider에 접근하기 위한 API라고 생각하면 편합니다. 다음으론 NextgramProvider의 onCreate query getType insert delete update
  • 137. • Contract Class 만들기 이렇게 만들어진 Contract Class는 Provider에 접근하기 위한 API라고 생각하면 편합니다. 다음으론 NextgramProvider의 onCreate query getType insert delete update MIME TYPE을 지원하지 않음. 아직 기능이 없음 아직 기능이 없음
  • 138. • Contract Class 만들기 이렇게 만들어진 Contract Class는 Provider에 접근하기 위한 API라고 생각하면 편합니다. 다음으론 NextgramProvider의 onCreate query insert 를 구현하겠습니다.
  • 139. • Content Provider 상속구현하기 Android Manifest 파일안에 manifest 안에 위의 퍼미션과 Provider가 지정되어야 합니다.
  • 140. • Content Provider 상속구현하기 NextgramProvider.java query, insert에서 사용할 URI정보를 관리할 Uri Matcher 객체를 생성합니다.
  • 141. • Content Provider 상속구현하기 NextgramContract.java Resolver를 통해 요청이 들어올때 “org.nhnnext.nextgram.provider/Articles”는 1 (ARTICLE_LIST) 처리 “org.nhnnext.nextgram.provider/Articles/#”는 2 (ARTICLE_ID) 처리
  • 142. • Content Provider 상속구현하기 다음으로 insert를 구현하겠습니다.
  • 143. • Content Provider 상속구현하기 처음보는 ContentValues가 나왔습니다. 나중에 설명해 드릴게요! NextgramProvider.java
  • 144. • Content Provider 상속구현하기 NextgramProvider.java
  • 145. • Content Provider 상속구현하기 NextgramProvider.java
  • 146. • Content Provider 상속구현하기 NextgramProvider.java
  • 147. • Content Provider 상속구현하기 insert는 구현이 완료되었으니 query를 구현하겠습니다.
  • 148. • Content Provider 상속구현하기 NextgramProvider.java Uri uri 객체를 통해 원하는 요청이 무엇인지 검사합니다.
  • 149. • Content Provider 상속구현하기 NextgramProvider.java URI가 “org.nhnnext.nextgram.provider” 일때 URI_MATCHER의 match()는 ARTICLE_LIST(1)을 반환합니다.
  • 150. • Content Provider 상속구현하기 NextgramProvider.java NextgramContract.java sortOrder값이 없다면 _ID를 기준으로 정렬합니다.
  • 151. • Content Provider 상속구현하기 NextgramProvider.java ARTICLE_ID 일 때에는 한개의 게시글을 가져오도록 코드를 작성합니다.
  • 152. • Content Provider 상속구현하기 ARTICLE_LIST, ARTICLE_ID 등 다양한 Uri에 대해 값들을 준비한 후 Database에 Query를 보내봅시다.
  • 153. • Content Provider 상속구현하기 NextgramProvider.java 요기에 작성!
  • 154. • Content Provider 상속구현하기 NextgramProvider.java database.query를 통해 Table, projection, selection, selectionArgs, sortOrder를 지정하고 query를 보냅니다.
  • 155. • Content Provider 상속구현하기 NextgramProvider.java 반환된 cursor를 return 해주면 완료!
  • 156. • Content Provider 상속구현하기 NextgramProvider.java의 insert, query를 구현 했으니 ProviderDao.java를 수정하도록 하겠습니다.
  • 157. • Content Provider 상속구현하기 ProviderDao.java의 • sqLiteInitialize • tableCreate • isTableExist 메서드를 제거해 줍니다. Database와 직접 연결하는것은 NextgramProvider의 역할입니다.
  • 158. • Content Provider 상속구현하기 ProviderDao.java의 • insertJsonData • getArticleList • getArticle insert 메서드를 수정할 겁니다. query
  • 159. • Content Provider 상속구현하기 1. insertJsonData 수정
  • 160. • Content Provider 상속구현하기 기존 Dao.java에서는 database에 직접 insert하는 쿼리에 컬럼의 값들을 직접 붙여 날리는 방법을 사용했습니다. 하지만 ContentResolver를 이용하면 database에 직접 접근할 수 없으므로 컬럼 값들을 ContentValues에 담아 전달해야 합니다.
  • 161. • Content Provider 상속구현하기 ContentValues 공식 레퍼런스 백문이 불여일견
  • 162. • Content Provider 상속구현하기 (기존) Dao.java - insertJsonData 메서드 (insert 쿼리를 만들어 database에 날림) Database에 직접 접근하던 코드를 Resolver를 통해 Provider를 사용하도록 수정합니다
  • 163. • Content Provider 상속구현하기 (수정) ProviderDao.java - insertJsonData 메서드 (각 컬럼의 값들을 ContentValues의 객체인 values에 담아 전달) Database에 직접 접근하던 코드를 Resolver를 통해 Provider를 사용하도록 수정합니다
  • 164. • Content Provider 상속구현하기 2. getArticleList 수정
  • 165. • Content Provider 상속구현하기 ProviderDao.java Dao.java getArticleList 메서드 틀린 그림 찾기
  • 166. • Content Provider 상속구현하기 Dao.java ProviderDao.java
  • 167. • Content Provider 상속구현하기 ProviderDao.java Dao.java
  • 168. • Content Provider 상속구현하기 2. getArticleByArticleNumber 수정
  • 169. • Content Provider 상속구현하기 ProviderDao.java Dao.java getArticleByArticleNumber 메서드 틀린 그림 찾기
  • 170. • Content Provider 상속구현하기 Dao.java ProviderDao.java
  • 171. section 2 Content Provider 다른
  • 173.  
  • 174.   내
  • 178. Server 변경된 앱의 구조 Activity ProviderDao database Proxy Service Content Provider를 통해 DB에 접근할 수 있게 됬습니다. Content Provider
  • 179. Activity Dao database 다른앱에 우리의 데이터를 제공하고 싶다면? 데이터가 저장되었을때 화면을 자동으로 재갱신하고 싶다면? 데이터를 핸들링하는 템플릿을 유지하고 싶다면?
  • 180. Activity Dao database 다른앱에 우리의 데이터를 제공하고 싶다면? 데이터가 저장되었을때 화면을 자동으로 재갱신하고 싶다면? 데이터를 핸들링하는 템플릿을 유지하고 싶다면?
  • 181. Activity Dao database 다른앱에 우리의 데이터를 제공하고 싶다면? 데이터가 저장되었을때 화면을 자동으로 재갱신하고 싶다면? 데이터를 핸들링하는 템플릿을 유지하고 싶다면?
  • 182. Activity Dao database 다른앱에 우리의 데이터를 제공하고 싶다면? 데이터가 저장되었을때 화면을 자동으로 재갱신하고 싶다면? 데이터를 핸들링하는 템플릿을 유지하고 싶다면?
  • 183. 데이터가 저장되었을때 화면을 자동으로 재갱신하고 싶다면?
  • 184. section 3 Cursor Adapter 데이터가
  • 188.  
  • 190. 데이터가 저장되었을때 화면을 자동으로 재갱신하고 싶다면? HomeViewAdapter를 CursorAdpater로 변경하자
  • 191. HomeView 변경 HomView.java Cursor Adapter는 데이터를 가져올때마다 갱신할 필요가 없습니다. 위의 주석처리된 부분을 삭제해주도록 합니다.
  • 192. HomeView 변경 HomView.java 위의 명령을 onCreate의 마지막 부분에 추가해주도록 합니다. 이제, listViewSimple1()을 변경해야 합니다.
  • 193. HomeView 변경 HomView.java CursorAdapter로 사용하기 위해 코드를 변경합니다. HomeViewAdapter는 context, cursor, layout 파일을 인자로 받습니다.
  • 194. CursorAdapter를 만들기 위해 HomeView는 준비를 끝냈으니 ArrayAdapter를 상속받은 HomeViewAdapter를 수정하도록 합니다.
  • 195. CursorAdapter 변경 CursorAdapter.java CursorAdapter를 상속받도록 변경합니다.
  • 196. CursorAdapter 변경 CursorAdapter.java 1. Context, Cursor, XML layoutID를 받도록 생성자를 변경합니다. 2. LayoutInflater도 미리 생성해두도록 합니다.
  • 197. CursorAdapter 변경 CursorAdapter.java CursorAdapter를 상속받으면 newView, bindView를 구현해야합니다. 이 둘은 기존의 getView의 기능을 분리해 둔 것입니다. getView 메서드는 지우도록합니다
  • 198. newView, bindView newView는 처음 view가 생성될때 실행됩니다. bindView는 이미 뷰가 생성되어있으면 실행합니다.
  • 200. ViewHolder Pattern 기존의 HomeViewAdapter.java의 getView() Adapter를 갱신할때마다 findViewById()를 사용해 성능이 저하되는것을 막기 위해 ViewHolder Pattern을 사용하도록 하겠습니다. View객체를 재사용하기 위한 목적
  • 201. CursorAdapter 변경 CursorAdapter.java CursorAdapter.java안에 ViewHolderItem 클래스를 작성합니다. 다음슬라이드부터 적극적으로 활용됩니다.
  • 202. CursorAdapter 변경 CursorAdapter.java xml파일로부터 inflate한 View를 만들어 줍니다. 반환을 위한 목적의 뷰입니다.
  • 203. CursorAdapter 변경 CursorAdapter.java ViewHolderItem 객체를 생성합니다.
  • 204. CursorAdapter 변경 CursorAdapter.java 1. ViewHolderItem 객체에게 resourceID에 대한 정보를 입력해줍니다. 2. View에게 setTag()를 활용해 입력해둡니다.
  • 206. CursorAdapter 변경 CursorAdapter.java Cursor로부터 View에 사용할 데이터를 저장합니다.
  • 207. CursorAdapter 변경 CursorAdapter.java getTag를 통해 viewHolderItem 객체를 획득한 후 articleNumber, writer, title을 셋팅합니다.
  • 208. CursorAdapter 변경 CursorAdapter.java ImageView도 셋팅하도록 합니다.
  • 209. CursorAdapter.java 마지막으로 HomeView에서 Item을 클릭했을때 ArticleNumber를 받아오는 부분을 수정하도록 합니다.
  • 210. 이로써 ArrayAdpater기반의 HomeViewAdapter를 CursorAdapter 기반으로 변경 완료!
  • 212. 왜 Cursor Adapter 일까? 현재사용하는 Adpater ArrayAdapter 배열 데이터를 위젯에 공급해주는 Adapter
  • 213. 왜 Cursor Adapter 일까? 현재사용하는 Adpater ArrayAdapter 배열 데이터를 위젯에 공급해주는 Adapter Array DB로부터 데이터를 획득해서 데이터를 Array로 변환.
  • 214. 왜 Cursor Adapter 일까? 현재사용하는 Adpater ArrayAdapter 배열 데이터를 위젯에 공급해주는 Adapter list_item.xml Array ArrayAdapter ArrayAdapter눈 Array의 데이터와 xml 파일을 결합.
  • 215. 왜 Cursor Adapter 일까? 현재사용하는 Adpater ArrayAdapter 배열 데이터를 위젯에 공급해주는 Adapter list_item.xml Array ArrayAdapter 사용자의 화면에 보여줌.
  • 216. 왜 Cursor Adapter 일까? 현재사용하는 Adpater ArrayAdapter 배열 데이터를 위젯에 공급해주는 Adapter Array 정보는 DB정보가 변경되어도 사용자 화면을 갱신하기 어려움
  • 217. 왜 Cursor Adapter 일까? CursorAdapter Cursor로 부터 획득한 데이터를 위젯에 공급해주는 Adapter Cursor list_item.xml CursorAdapter DB Uri를 가진 Cursor를 통해 DB와 연결됨.
  • 218. 왜 Cursor Adapter 일까? CursorAdapter Cursor로 부터 획득한 데이터를 위젯에 공급해주는 Adapter list_item.xml Cursor CursorAdapter 사용자의 화면에 보여줌.
  • 219. 왜 Cursor Adapter 일까? CursorAdapter Cursor로 부터 획득한 데이터를 위젯에 공급해주는 Adapter list_item.xml Cursor CursorAdapter DB의 내용이 갱신될때마다 사용자의 화면을 변경하기 용이함
  • 220. 왜 Cursor Adapter 일까? CursorAdapter와 ContentProvider사이의 패턴 list_item.xml Cursor CursorAdapter ContentProvider
  • 221. Cursor Adapter 와 Content Provider 상황 : 사용자A가 HomeView를 보고있을때 사용자B가 새로운 글을 입력하는 상황
  • 222. 사용자B가 게시글을 작성하면 서버에 게시글이 업로드됨. 사용자B Server
  • 223. 서비스가 동작하면서 사용자A의 어플리케이션이 서버에서 게시글을 받아옴. Server 사용자 A
  • 224. 사용자A의 어플리케이션의 ContentProvider를 통해 Database에 insert됨 사용자 A
  • 225. 사용자A의 어플리케이션의 ContentProvider를 통해 Database에 insert됨 사용자 A insert될떄 notifyChange동작
  • 226. Cursor를 통해 연결되어있는 CursorAdapter가 동작후 뷰 재갱신 list_item.xml 데이터가 변경됐어! Cursor CursorAdapter ContentProvider
  • 227. Cursor를 통해 연결되어있는 CursorAdapter가 동작후 뷰 재갱신 list_item.xml Cursor CursorAdapter ContentProvider 알겠어!
  • 228. Cursor를 통해 연결되어있는 CursorAdapter가 동작후 뷰 재갱신 list_item.xml Cursor CursorAdapter ContentProvider CursorAdapter와 ContentProvider사이에는 무슨일이 있는걸까?
  • 230. ContentProvider CursorAdapter publisher/Subscribe Pattern 사이의 CursorAdapter Register ContentProvider Subscribe Subscribe Notify 1. Content Provider가 notifyChange메서드를 호출한다. 2. 등록되어있던 Subscribe들의 OnChange()가 호출된다. 3. CursorAdapter는 내부적으로 notifyDataSetChanged()를 호출한다.
  • 231. section 3 Cursor Adapter 데이터가