* query 후 화면
데이터를 쿼리할 때는 비동기적으로 처리해줘야 하므로, 백그라운드 스레드에서 데이터를 가져와야 한다.
-> AsyncTask Loader 사용한다.
AsyncTask Loader
- onStartLoading(): 데이터를 로드하는 콜백 메서드를 구현한다.
- loadInBackground(): query를 백그라운드에서 수행한다.
- deliverResult(): 데이터를 반환한다.
Provider code
1. 할일 데이터베이스에 대한 읽기 액세스 권한을 얻는다.
Get readable access to the underlying task database.
2. 할일 디렉토리와 디폴트를 인식하기 위해, match와 switch-case 코드를 작성한다.
Write match code and a switch-case to recognize the task directory and default case.
3. 할일 디렉토리를 조회한다.
Query for the tasks directory.
4. 커서에 알림 URI를 설정한다.
Set a notification URI on the Cursor.
data/TaskContentProvider.java
UI code
5. ContentResolver를 사용하여 모든 할일 데이터를 조회하고, 해당 데이터를 우선 순위별로 분류한다.
Use a ContentResolver to query for all of the task data, and sort that data by priority.
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | package com.tistory.qlyh8.buildcontentprovider; import android.annotation.SuppressLint; import android.content.Intent; import android.database.Cursor; import android.support.design.widget.FloatingActionButton; import android.support.v4.content.AsyncTaskLoader; import android.support.v4.content.Loader; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.util.Log; import android.view.View; import com.tistory.qlyh8.buildcontentprovider.data.TaskContract; public class MainActivity extends AppCompatActivity implements android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>{ private static final String TAG = MainActivity.class.getSimpleName(); private static final int TASK_LOADER_ID = 0; private CustomCursorAdapter mAdapter; RecyclerView mRecyclerView; FloatingActionButton fabButton; @Override protected void onCreate(Bundle savedInstanceState) {...} // 일시중지되거나 재시작된 후에 메소드가 호출된다. // 보통 새로운 데이터가 AddTaskActivity 를 통해 삽입 된 후이다. // 이렇게하면 변경 사항에 대한 기본 데이터를 다시 쿼리하기 위해 로더가 다시 시작된다. @Override protected void onResume() {...} // 지정된 ID로 새로운 AsyncTaskLoader 를 인스턴스화하고 반환한다. // 이 로더는 작업 데이터를 커서 또는 오류가 발생하면 null 로 반환한다. // 로딩의 모든 단계에서 데이터 로딩을 처리하기 위해 필요한 콜백을 구현한다. @SuppressLint("StaticFieldLeak") @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return new AsyncTaskLoader<Cursor>(this) { Cursor mTaskData = null; // 로더가 먼저 데이터를 로드할 때 호출된다. @Override protected void onStartLoading() {...} // 데이터의 비동기 로딩을 수행한다. @Override public Cursor loadInBackground() { try { return getContentResolver().query(TaskContract.TaskEntry.CONTENT_URI, null, null, null, TaskContract.TaskEntry.COLUMN_PRIORITY); } catch (Exception e){ Log.e(TAG, "Failed to asynchronously load data."); e.printStackTrace(); return null; } } // 로드와 커서의 결과를 등록된 리스너에 보낸다. @Override public void deliverResult(Cursor data) {...} }; } // 이전에 작성된 로더가 로드를 완료하면 호출된다. @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) {...} // 이전에 작성된 로더가 재설정될 때 호출되어 해당 데이터를 사용할 수 없게 만든다. // 로더의 데이터에 대해 갖는 모든 참조를 제거한다. @Override public void onLoaderReset(Loader<Cursor> loader) {...} } | cs |
Android Course of Udacity - Lesson 9
'Android' 카테고리의 다른 글
adMob - (1) 앱에 광고 달기 (1) | 2018.03.03 |
---|---|
Custom Content Provider - (4) 데이터 삭제 (0) | 2018.02.12 |
Custom Content Provider - (2) URIMatcher 생성 및 데이터 삽입 (0) | 2018.01.13 |
Custom Content Provider - (1) 프로바이더 및 URI 생성 (0) | 2018.01.10 |
Content Provider - (3) 코드에 적용하기 (0) | 2018.01.08 |