diff options
author | David Friedman <dmail@google.com> | 2015-07-24 19:52:06 -0700 |
---|---|---|
committer | David Friedman <dmail@google.com> | 2015-10-02 14:10:56 -0700 |
commit | bfbd27b84fb310ed007705f18cf13aeeda098096 (patch) | |
tree | b64d8ca46bee1fbbef0427f50450b8b1fdfdb2a6 /docs/html-intl/intl/in/guide/components/loaders.jd | |
parent | 586f56aa790b84a59981c1ef32857765e58393d2 (diff) |
Localization for Android fundamentals
Bug: 20503562
Change-Id: Ia98618932aef2b92a48e4d6e69749c220161722f
Diffstat (limited to 'docs/html-intl/intl/in/guide/components/loaders.jd')
-rw-r--r-- | docs/html-intl/intl/in/guide/components/loaders.jd | 494 |
1 files changed, 494 insertions, 0 deletions
diff --git a/docs/html-intl/intl/in/guide/components/loaders.jd b/docs/html-intl/intl/in/guide/components/loaders.jd new file mode 100644 index 000000000000..cd0379bf1cd9 --- /dev/null +++ b/docs/html-intl/intl/in/guide/components/loaders.jd @@ -0,0 +1,494 @@ +page.title=Aktivitas +parent.title=Loader +parent.link=activities.html +@jd:body +<div id="qv-wrapper"> +<div id="qv"> + <h2>Dalam dokumen ini</h2> + <ol> + <li><a href="#summary">Rangkuman Loader API</a></li> + <li><a href="#app">Menggunakan Loader dalam Aplikasi</a> + <ol> + <li><a href="#requirements"></a></li> + <li><a href="#starting">Memulai Loader</a></li> + <li><a href="#restarting">Me-restart Loader</a></li> + <li><a href="#callback">Menggunakan Callback LoaderManager</a></li> + </ol> + </li> + <li><a href="#example">Contoh</a> + <ol> + <li><a href="#more_examples">Contoh Selengkapnya</a></li> + </ol> + </li> + </ol> + + <h2>Kelas-kelas utama</h2> + <ol> + <li>{@link android.app.LoaderManager}</li> + <li>{@link android.content.Loader}</li> + + </ol> + + <h2>Contoh-contoh terkait</h2> + <ol> + <li> <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderCursor.html"> +LoaderCursor</a></li> + <li> <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html"> +LoaderThrottle</a></li> + </ol> + </div> +</div> + +<p>Diperkenalkan di Android 3.0, loader memudahkan pemuatan data asinkron +dalam aktivitas atau fragmen. Loader memiliki karakteristik ini:</p> + <ul> + <li>Loader tersedia untuk setiap {@link android.app.Activity} dan {@link +android.app.Fragment}.</li> + <li>Loader menyediakan pemuatan data asinkron.</li> + <li>Loader memantau sumber data mereka dan memberikan hasil baru bila +konten berubah.</li> + <li>Loader secara otomatis menghubungkan kembali ke kursor loader lalu saat +dibuat kembali setelah perubahan konfigurasi. Karena itu, loader tidak perlu melakukan query ulang +datanya.</li> + </ul> + +<h2 id="summary">Rangkuman Loader API</h2> + +<p>Ada beberapa kelas dan antarmuka yang mungkin dilibatkan dalam menggunakan +loader pada aplikasi. Semuanya dirangkum dalam tabel ini:</p> + +<table> + <tr> + <th>Kelas/Antarmuka</th> + <th>Keterangan</th> + </tr> + <tr> + <td>{@link android.app.LoaderManager}</td> + <td>Kelas abstrak yang dikaitkan dengan {@link android.app.Activity} atau +{@link android.app.Fragment} untuk mengelola satu atau beberapa instance {@link +android.content.Loader}. Ini membantu aplikasi mengelola +operasi berjalan lebih lama bersamaan dengan daur hidup {@link android.app.Activity} +atau {@link android.app.Fragment}; penggunaan paling umumnya adalah dengan +{@link android.content.CursorLoader}, akan tetapi aplikasi bebas menulis loader-nya + sendiri untuk memuat tipe data lainnya. + <br /> + <br /> + Hanya ada satu {@link android.app.LoaderManager} per aktivitas atau fragmen. Namun {@link android.app.LoaderManager} bisa memiliki +beberapa loader.</td> + </tr> + <tr> + <td>{@link android.app.LoaderManager.LoaderCallbacks}</td> + <td>Antarmuka callback untuk klien berinteraksi dengan {@link +android.app.LoaderManager}. Misalnya, Anda menggunakan metode callback {@link +android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()} +untuk membuat loader baru.</td> + </tr> + <tr> + <td>{@link android.content.Loader}</td> + <td>Kelas abstrak yang melakukan pemuatan data asinkron. Ini +adalah kelas dasar untuk loader. Biasanya Anda akan menggunakan {@link +android.content.CursorLoader}, namun Anda bisa menerapkan subkelas sendiri. Selagi +loader aktif, loader harus memantau sumber datanya dan memberikan hasil +baru bila konten berubah. </td> + </tr> + <tr> + <td>{@link android.content.AsyncTaskLoader}</td> + <td>Loader abstrak yang menyediakan {@link android.os.AsyncTask} untuk melakukan pekerjaan.</td> + </tr> + <tr> + <td>{@link android.content.CursorLoader}</td> + <td>Subkelas {@link android.content.AsyncTaskLoader} yang meng-query +{@link android.content.ContentResolver} dan mengembalikan {@link +android.database.Cursor}. Kelas ini mengimplementasikan protokol {@link +android.content.Loader} dengan cara standar untuk query kursor, +yang dibuat berdasarkan {@link android.content.AsyncTaskLoader} untuk melakukan query kursor +pada thread latar belakang agar tidak memblokir UI aplikasi. Menggunakan loader +ini merupakan cara terbaik untuk memuat data secara asinkron dari {@link +android.content.ContentProvider}, sebagai ganti melakukan query terkelola melalui +fragmen atau API aktivitas.</td> + </tr> +</table> + +<p>Kelas dan antarmuka dalam tabel di atas merupakan komponen +esensial yang akan Anda gunakan untuk mengimplementasikan loader dalam aplikasi Anda. Anda tidak memerlukan semuanya +untuk setiap loader yang dibuat, namun Anda akan selalu memerlukan acuan ke {@link +android.app.LoaderManager} untuk memulai loader dan implementasi +kelas {@link android.content.Loader} seperti {@link +android.content.CursorLoader}. Bagian berikut ini menunjukkan kepada Anda cara menggunakan +kelas dan antarmuka ini dalam aplikasi.</p> + +<h2 id ="app">Menggunakan Loader dalam Aplikasi</h2> +<p>Bagian ini menjelaskan cara menggunakan loader dalam aplikasi Android. Aplikasi +yang menggunakan loader biasanya berisi yang berikut ini:</p> +<ul> + <li>{@link android.app.Activity} atau {@link android.app.Fragment}.</li> + <li>Instance {@link android.app.LoaderManager}.</li> + <li>{@link android.content.CursorLoader} akan memuat data yang didukung oleh {@link +android.content.ContentProvider}. Atau, Anda dapat mengimplementasikan subkelas sendiri + dari {@link android.content.Loader} atau {@link android.content.AsyncTaskLoader} untuk +memuat data dari beberapa sumber lain.</li> + <li>Implementasi untuk {@link android.app.LoaderManager.LoaderCallbacks}. +Di sinilah Anda membuat loader baru dan mengelola acuan bagi loader +yang ada.</li> +<li>Cara menampilkan data loader, seperti {@link +android.widget.SimpleCursorAdapter}.</li> + <li>Sumber data, seperti {@link android.content.ContentProvider}, saat menggunakan +{@link android.content.CursorLoader}.</li> +</ul> +<h3 id="starting">Memulai Loader</h3> + +<p>{@link android.app.LoaderManager} mengelola satu atau beberapa instance {@link +android.content.Loader} dalam {@link android.app.Activity} atau +{@link android.app.Fragment}. Hanya ada satu {@link +android.app.LoaderManager} per aktivitas atau fragmen.</p> + +<p>Anda biasanya +memulai {@link android.content.Loader} dalam metode {@link +android.app.Activity#onCreate onCreate()} aktivitas, atau dalam metode +{@link android.app.Fragment#onActivityCreated onActivityCreated()} fragmen. Anda +melakukannya dengan cara berikut ini:</p> + +<pre>// Prepare the loader. Either re-connect with an existing one, +// or start a new one. +getLoaderManager().initLoader(0, null, this);</pre> + +<p>Metode {@link android.app.LoaderManager#initLoader initLoader()} mengambil +parameter berikut:</p> +<ul> + <li>ID unik yang mengidentifikasi loader. Dalam contoh ini, ID-nya adalah 0.</li> +<li>Argumen opsional untuk dipasok ke loader +pada saat pembuatan (dalam contoh ini <code>null</code>).</li> + +<li>Implementasi {@link android.app.LoaderManager.LoaderCallbacks}, yang +akan dipanggil {@link android.app.LoaderManager} untuk melaporkan kejadian loader. Dalam contoh +ini, kelas lokal mengimplementasikan antarmuka {@link +android.app.LoaderManager.LoaderCallbacks}, sehingga meneruskan acuan +ke dirinya sendiri, {@code this}.</li> +</ul> +<p>Panggilan {@link android.app.LoaderManager#initLoader initLoader()} memastikan bahwa loader +telah dimulai dan aktif. Ia memiliki dua kemungkinan hasil:</p> +<ul> + <li>Jika loader yang disebutkan oleh ID sudah ada, loader yang dibuat terakhir akan digunakan +kembali.</li> + <li>Jika loader yang disebutkan oleh ID <em>tidak</em> ada, +{@link android.app.LoaderManager#initLoader initLoader()} akan memicu metode +{@link android.app.LoaderManager.LoaderCallbacks} {@link android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}. +Di sinilah Anda mengimplementasikan kode untuk membuat instance dan mengembalikan loader baru. +Untuk diskusi selengkapnya, lihat bagian <a href="#onCreateLoader">onCreateLoader</a>.</li> +</ul> +<p>Dalam hal ini, implementasi {@link android.app.LoaderManager.LoaderCallbacks} +yang ditentukan akan dikaitkan dengan loader, dan akan dipanggil bila +status loader berubah. Jika saat panggilan ini status pemanggil sudah +dimulai, dan loader yang diminta sudah ada dan telah menghasilkan +datanya, maka sistem segera memanggil {@link +android.app.LoaderManager.LoaderCallbacks#onLoadFinished onLoadFinished()} +(selama {@link android.app.LoaderManager#initLoader initLoader()}), +sehingga Anda harus siap bila hal ini terjadi. Lihat <a href="#onLoadFinished"> +onLoadFinished</a> untuk diskusi selengkapnya mengenai callback ini</p> + +<p>Perhatikan bahwa metode {@link android.app.LoaderManager#initLoader initLoader()} +mengembalikan {@link android.content.Loader} yang dibuat, namun Anda tidak +perlu menangkap acuan ke sana. {@link android.app.LoaderManager} mengelola +masa hidup loader secara otomatis. {@link android.app.LoaderManager} +memulai dan menghentikan pemuatan jika perlu, dan menjaga status loader +dan konten terkaitnya. Seperti yang tersirat di sini, Anda akan jarang berinteraksi dengan loader +secara langsung (meskipun misalnya menggunakan metode loader untuk menyempurnakan perilaku +loader, lihat contoh <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html"> LoaderThrottle</a>). +Anda paling sering akan menggunakan metode {@link +android.app.LoaderManager.LoaderCallbacks} untuk mengintervensi proses +pemuatan saat terjadi kejadian tertentu. Untuk diskusi selengkapnya mengenai topik ini, lihat <a href="#callback">Menggunakan Callback LoaderManager</a>.</p> + +<h3 id="restarting">Me-restart Loader</h3> + +<p>Bila Anda menggunakan {@link android.app.LoaderManager#initLoader initLoader()}, seperti +ditampilkan di atas, loader yang ada akan digunakan dengan ID yang ditetapkan jika ada. +Jika tidak ada, ID akan dibuat. Namun kadang-kadang Anda perlu membuang data lama +dan mulai dari awal.</p> + +<p>Untuk membuang data lama, gunakan {@link +android.app.LoaderManager#restartLoader restartLoader()}. Misalnya, implementasi +{@link android.widget.SearchView.OnQueryTextListener} ini akan me-restart +bila query pengguna berubah. Loader perlu di-restart +agar dapat menggunakan filter pencarian yang telah direvisi untuk melakukan query baru:</p> + +<pre> +public boolean onQueryTextChanged(String newText) { + // Called when the action bar search text has changed. Update + // the search filter, and restart the loader to do a new query + // with this filter. + mCurFilter = !TextUtils.isEmpty(newText) ? newText : null; + getLoaderManager().restartLoader(0, null, this); + return true; +}</pre> + +<h3 id="callback">Menggunakan Callback LoaderManager</h3> + +<p>{@link android.app.LoaderManager.LoaderCallbacks} adalah antarmuka callback +yang memungkinkan klien berinteraksi dengan {@link android.app.LoaderManager}. </p> +<p>Loader, khususnya {@link android.content.CursorLoader}, diharapkan +mempertahankan datanya setelah dihentikan. Ini memungkinkan aplikasi mempertahankan +datanya di aktivitas atau metode {@link android.app.Activity#onStop +onStop()} fragmen dan {@link android.app.Activity#onStart onStart()}, sehingga +bila pengguna kembali ke aplikasi, mereka tidak harus menunggu data +dimuat kembali. Anda menggunakan metode {@link android.app.LoaderManager.LoaderCallbacks} +untuk mengetahui waktu membuat loader baru, dan memberi tahu aplikasi kapan +berhenti menggunakan data loader.</p> + +<p>{@link android.app.LoaderManager.LoaderCallbacks} berisi metode +ini:</p> +<ul> + <li>{@link android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()} — +Membuat instance dan mengembalikan {@link android.content.Loader} baru untuk ID yang diberikan. +</li></ul> +<ul> + <li> {@link android.app.LoaderManager.LoaderCallbacks#onLoadFinished onLoadFinished()} +— Dipanggil bila loader yang dibuat sebelumnya selesai dimuat. +</li></ul> +<ul> + <li>{@link android.app.LoaderManager.LoaderCallbacks#onLoaderReset onLoaderReset()} + — Dipanggil bila loader yang dibuat sebelumnya sedang di-reset, sehingga datanya +tidak tersedia. +</li> +</ul> +<p>Metode ini dijelaskan lebih detail dalam bagian berikutnya.</p> + +<h4 id ="onCreateLoader">onCreateLoader</h4> + +<p>Saat Anda mencoba mengakses loader (misalnya, melalui {@link +android.app.LoaderManager#initLoader initLoader()}), ia akan memeriksa untuk mengetahui adanya +loader yang ditetapkan oleh ID. Jika tidak ada, ia akan memicu metode {@link +android.app.LoaderManager.LoaderCallbacks} {@link +android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}. Di +sinilah Anda membuat loader baru. Biasanya ini adalah {@link +android.content.CursorLoader}, namun Anda bisa mengimplementasikan sendiri subkelas {@link +android.content.Loader}. </p> + +<p>Dalam contoh ini, metode callback {@link +android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()} + akan membuat {@link android.content.CursorLoader}. Anda harus membuat +{@link android.content.CursorLoader} menggunakan metode konstruktornya, yang +memerlukan set informasi lengkap untuk melakukan query ke {@link +android.content.ContentProvider}. Secara khusus, ia memerlukan:</p> +<ul> + <li><em>uri</em> — URI untuk konten yang akan diambil. </li> + <li><em>projection</em> — Daftar berisi kolom yang akan dikembalikan. Meneruskan +<code>null</code> akan mengembalikan semua kolom, jadi tidak efisien. </li> + <li><em>selection</em> — Filter yang mendeklarasikan baris yang akan dikembalikan, +diformat sebagai klausa SQL WHERE (tidak termasuk WHERE itu sendiri). Meneruskan +<code>null</code> akan mengembalikan semua baris untuk URI yang diberikan. </li> + <li><em>selectionArgs</em> — Anda dapat menyertakan ?s dalam pilihan, yang akan +digantikan dengan nilai dari <em>selectionArgs</em>, agar muncul dalam +pilihan. Nilai-nilai akan diikat sebagai String. </li> + <li><em>sortOrder</em> — Cara menyusun baris, diformat sebagai klausa SQL +ORDER BY (tidak termasuk ORDER BY itu sendiri). Meneruskan <code>null</code> akan +menggunakan urutan sortir default, yang mungkin tidak berurutan.</li> +</ul> +<p>Misalnya:</p> +<pre> + // If non-null, this is the current filter the user has provided. +String mCurFilter; +... +public Loader<Cursor> onCreateLoader(int id, Bundle args) { + // This is called when a new Loader needs to be created. This + // sample only has one Loader, so we don't care about the ID. + // First, pick the base URI to use depending on whether we are + // currently filtering. + Uri baseUri; + if (mCurFilter != null) { + baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, + Uri.encode(mCurFilter)); + } else { + baseUri = Contacts.CONTENT_URI; + } + + // Now create and return a CursorLoader that will take care of + // creating a Cursor for the data being displayed. + String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" + + Contacts.HAS_PHONE_NUMBER + "=1) AND (" + + Contacts.DISPLAY_NAME + " != '' ))"; + return new CursorLoader(getActivity(), baseUri, + CONTACTS_SUMMARY_PROJECTION, select, null, + Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); +}</pre> +<h4 id="onLoadFinished">onLoadFinished</h4> + +<p>Metode ini dipanggil bila loader yang dibuat sebelumnya selesai dimuat. +Metode ini dijamin dipanggil sebelum pelepasan data terakhir +yang disediakan untuk loader ini. Di titik ini Anda harus menyingkirkan semua penggunaan +data lama (karena akan segera dilepas), namun jangan melepas sendiri +data tersebut karena loader memilikinya dan akan menanganinya.</p> + + +<p>Loader akan melepas data setelah mengetahui bahwa aplikasi tidak +lagi menggunakannya. Misalnya, jika data adalah kursor dari {@link +android.content.CursorLoader}, Anda tidak boleh memanggil {@link +android.database.Cursor#close close()} sendiri. Jika kursor ditempatkan +dalam {@link android.widget.CursorAdapter}, Anda harus menggunakan metode {@link +android.widget.SimpleCursorAdapter#swapCursor swapCursor()} agar +{@link android.database.Cursor} lama tidak ditutup. Misalnya:</p> + +<pre> +// This is the Adapter being used to display the list's data.<br +/>SimpleCursorAdapter mAdapter; +... + +public void onLoadFinished(Loader<Cursor> loader, Cursor data) { + // Swap the new cursor in. (The framework will take care of closing the + // old cursor once we return.) + mAdapter.swapCursor(data); +}</pre> + +<h4 id="onLoaderReset">onLoaderReset</h4> + +<p>Metode ini dipanggil bila loader yang dibuat sebelumnya sedang di-reset, sehingga datanya +tidak tersedia. Callback ini memungkinkan Anda mengetahui +kapan data akan dilepas sehingga dapat menghapus acuannya ke callback. </p> +<p>Implementasi ini memanggil +{@link android.widget.SimpleCursorAdapter#swapCursor swapCursor()} +dengan nilai <code>null</code>:</p> + +<pre> +// This is the Adapter being used to display the list's data. +SimpleCursorAdapter mAdapter; +... + +public void onLoaderReset(Loader<Cursor> loader) { + // This is called when the last Cursor provided to onLoadFinished() + // above is about to be closed. We need to make sure we are no + // longer using it. + mAdapter.swapCursor(null); +}</pre> + + +<h2 id="example">Contoh</h2> + +<p>Sebagai contoh, berikut ini adalah implementasi penuh {@link +android.app.Fragment} yang menampilkan {@link android.widget.ListView} berisi +hasil query terhadap penyedia konten kontak. Ia menggunakan {@link +android.content.CursorLoader} untuk mengelola query pada penyedia.</p> + +<p>Agar aplikasi dapat mengakses kontak pengguna, seperti yang ditampilkan dalam contoh ini, +manifesnya harus menyertakan izin +{@link android.Manifest.permission#READ_CONTACTS READ_CONTACTS}.</p> + +<pre> +public static class CursorLoaderListFragment extends ListFragment + implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> { + + // This is the Adapter being used to display the list's data. + SimpleCursorAdapter mAdapter; + + // If non-null, this is the current filter the user has provided. + String mCurFilter; + + @Override public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + // Give some text to display if there is no data. In a real + // application this would come from a resource. + setEmptyText("No phone numbers"); + + // We have a menu item to show in action bar. + setHasOptionsMenu(true); + + // Create an empty adapter we will use to display the loaded data. + mAdapter = new SimpleCursorAdapter(getActivity(), + android.R.layout.simple_list_item_2, null, + new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS }, + new int[] { android.R.id.text1, android.R.id.text2 }, 0); + setListAdapter(mAdapter); + + // Prepare the loader. Either re-connect with an existing one, + // or start a new one. + getLoaderManager().initLoader(0, null, this); + } + + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + // Place an action bar item for searching. + MenuItem item = menu.add("Search"); + item.setIcon(android.R.drawable.ic_menu_search); + item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + SearchView sv = new SearchView(getActivity()); + sv.setOnQueryTextListener(this); + item.setActionView(sv); + } + + public boolean onQueryTextChange(String newText) { + // Called when the action bar search text has changed. Update + // the search filter, and restart the loader to do a new query + // with this filter. + mCurFilter = !TextUtils.isEmpty(newText) ? newText : null; + getLoaderManager().restartLoader(0, null, this); + return true; + } + + @Override public boolean onQueryTextSubmit(String query) { + // Don't care about this. + return true; + } + + @Override public void onListItemClick(ListView l, View v, int position, long id) { + // Insert desired behavior here. + Log.i("FragmentComplexList", "Item clicked: " + id); + } + + // These are the Contacts rows that we will retrieve. + static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { + Contacts._ID, + Contacts.DISPLAY_NAME, + Contacts.CONTACT_STATUS, + Contacts.CONTACT_PRESENCE, + Contacts.PHOTO_ID, + Contacts.LOOKUP_KEY, + }; + public Loader<Cursor> onCreateLoader(int id, Bundle args) { + // This is called when a new Loader needs to be created. This + // sample only has one Loader, so we don't care about the ID. + // First, pick the base URI to use depending on whether we are + // currently filtering. + Uri baseUri; + if (mCurFilter != null) { + baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, + Uri.encode(mCurFilter)); + } else { + baseUri = Contacts.CONTENT_URI; + } + + // Now create and return a CursorLoader that will take care of + // creating a Cursor for the data being displayed. + String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" + + Contacts.HAS_PHONE_NUMBER + "=1) AND (" + + Contacts.DISPLAY_NAME + " != '' ))"; + return new CursorLoader(getActivity(), baseUri, + CONTACTS_SUMMARY_PROJECTION, select, null, + Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); + } + + public void onLoadFinished(Loader<Cursor> loader, Cursor data) { + // Swap the new cursor in. (The framework will take care of closing the + // old cursor once we return.) + mAdapter.swapCursor(data); + } + + public void onLoaderReset(Loader<Cursor> loader) { + // This is called when the last Cursor provided to onLoadFinished() + // above is about to be closed. We need to make sure we are no + // longer using it. + mAdapter.swapCursor(null); + } +}</pre> +<h3 id="more_examples">Contoh Selengkapnya</h3> + +<p>Ada beberapa contoh berbeda dalam <strong>ApiDemos</strong> yang +mengilustrasikan cara menggunakan loader:</p> +<ul> + <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderCursor.html"> +LoaderCursor</a> — Versi lengkap dari +cuplikan yang ditampilkan di atas.</li> + <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html"> LoaderThrottle</a> — Contoh cara penggunaan throttling untuk +mengurangi jumlah query dari penyedia konten saat datanya berubah.</li> +</ul> + +<p>Untuk informasi tentang mengunduh dan menginstal contoh SDK, lihat <a href="http://developer.android.com/resources/samples/get.html"> Mendapatkan +Contoh</a>. </p> + |