Android Loaders Tutorial |
http://developer.android.com/guide/components/loaders.html
Android 3.0 부터 Loader 가 등장하여 async 하게 data 를 load 할 수 있게 되었다.
Loader 는 다음과 같은 특징이 있다.
- Activity, Fragment 에서 접근 가능하다.
- Data 를 async 하게 load 한다.
- Source data 를 monitor 하면서 내용이 변경되면 새로운 결과를 전달한다.
- config change 등과 같은 activity, fragment 의 recreation 시 기존 자료를 자동으로 reload 한다.
Loader API Summary
LoaderManager
Activity 혹은 Fragment 당 하나의 LoaderManager 가 있다.
LoaderManager 는 여러개의 Loader 를 가지고 있으며, 주로 CursorLoader 가 사용된다.
LoaderManager.LoaderCallbacks
LoaderManager 에 관련된 callback interface.
새로운 loader 를 만들 때 onCreateLoader() 가 사용된다.
Loader
실제로 data 를 async 하게 load 하는 abstract class.
Loader 는 Contents 의 변경이 있을 때 그 내용을 전달할 수도 있어야 한다.
AsnycTaskLoader
AsyncTask 를 제공하는 Abstract Loader.
CursorLoader
AsyncTaskLoader 의 subclass 로 ContentResolver 를 통해 query 를 하고 Cursor 를 return 한다.
Application 에서 Loader 사용하기
Loader 를 사용하기 위해서 다음과 같은 것들이 필요하다.
- Activity 혹은 Fragment
- LoaderManager instance.
- ContentProvider에 연결된 CursorLoader.
Loader 나 AsyncTaskLoader 를 상속한 custom loader 도 가능하다.
- LoaderManager.LoaderCallbacks 구현.
새로운 Loader 를 만들거나 기존 존재하는 loader 관리를 위해 필요하다.
- SimpleCursorAdapter 와 같은 loader가 제공하는 data 를 연계시킬 무엇.
- ContentProvider 와 같은 data 의 source
Starting a Loader
Loader 는 보통 activity 의 onCreate() 나 fragment 의 onActivityCreated() 에서 생성한다.
getLoaderManager().initLoader( 0, null, this );
param 은 순서대로 id, optional argument, LoaderManager.LoaderCallbacks.
initLoader() 함수는 loader 를 초기화시키고 활성화시킨다.
만약 명시한 ID 의 loader 가 이미 존재한다면, 가장 나중에 사용된 loader 가 재사용된다.
만약 명시한 ID 의 loader 가 존재하지 않으면, 새로운 로더를 생성해서 return 시켜준다.
보통 LoaderManager 를 통해 만든 Loader 의 reference 를 저장하지 않는다.
Loader 의 사용은 보통 LoaderCallbacks 을 이용한다.
Restarting a Loader
만약 기존 Loader 가 존재할 경우 그 data 를 버리고 싶다면,
initLoader() 대신 restartLoader() 를 호출해주면 된다.
Using the LoaderManager Callbacks
onCreateLoader() : Loader 가 처음 생성되었을 때 불린다.
onLoadFinished() : data load 가 끝났을 때 불린다.
onLoaderReset() : load 된 data 가 reset 되었을 때 불린다.
onCreateLoader
public Loader<Cursor> onCreateLoader( int id, Bundle args ){
Uri baseUri = Contacts.CONTENT_URI;
return new CursorLoader( getActivity(), baseUri, null, null, null, null );
}
onLoadFinished
SimpleCursorAdapter mAdapter;
..
public void onLoadFinished( Loader<Cursor> loader, Cursor data ){
mAdapter.swapCursor( data );
}
onLoadReset
SimpleCursorAdapter mAdapter;
..
public void onLoadReset( Loader<Cursor> loader ){
mAdapter.swapCursor( null );
}
example
http://developer.android.com/guide/components/loaders.html#example
ApiDemos 에 더 많은 sample 이 있다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] 연락처 수정, 삭제에 대한 추가정보 (0) | 2015.11.16 |
---|---|
[android] Bitmap 변환시 exif 정보 유지시키기 (0) | 2015.11.09 |
[android] expandable listview tutorial (0) | 2015.11.01 |
[android] Google Play Service 는 나쁜놈이었다. (0) | 2015.09.16 |
병렬 프로그램을 위한 어노테이션 (0) | 2015.07.20 |
댓글