Yükleyiciler, Android 9 (API düzeyi 28) sürümünden itibaren kullanımdan kaldırılmıştır. Önerilen seçenek
Activity
ve Fragment
yaşam döngülerini ele alırken veri yüklemeyle uğraşmak, bir
ViewModel
nesne kombinasyonu
ve LiveData
.
Modeller, yükleyiciler gibi yapılandırma değişikliklerinden sonra da sağlanmış olsa da
daha az standart koddur. LiveData
, şu uygulamalarda yeniden kullanabileceğiniz verileri yüklemenin yaşam döngüsüne duyarlı bir yöntem sunar:
model oluşturabilirsiniz. Şunları da kullanabilirsiniz: LiveData
MediatorLiveData
Web sitenizdekiler gibi gözlemlenebilir
Oda veritabanı, değişiklikleri gözlemlemek için kullanılabilir
nasıl işlediğini tartıştık.
ViewModel
ve LiveData
özelliklerini erişiminizin olmadığı durumlarda da kullanabilirsiniz
LoaderManager
arasında, örneğin bir
Service
. Bu ikisini birlikte kullanmak
tandem, kullanıcı arayüzüyle uğraşmak zorunda kalmadan uygulamanızın ihtiyaç duyduğu verilere kolay bir şekilde erişmenizi sağlar
yaşam döngüsü boyunca geçerlidir. LiveData
hakkında daha fazla bilgi için bkz.
LiveData
için genel bakış. Şu konu hakkında daha fazla bilgi edinmek için:
ViewModel
, ViewModel
genel bakış sayfasını inceleyin.
Yükleyici API, verileri bir sunucudan
içerik sağlayıcı
veya FragmentActivity
içinde görüntülenecek başka bir veri kaynağı
veya Fragment
.
Yükleyici olmadığında karşılaşabileceğiniz sorunlardan bazıları şunlardır:
- Verileri doğrudan etkinlik veya parçanın içinde getirirseniz kullanıcılarınız düşük performans sergilediği için yeterince yanıt veremiyor kullanıcı arayüzü iş parçacığından sorgu ekler.
- Verileri başka bir ileti dizisinden (örneğin,
AsyncTask
ile) getirirseniz hem bu ileti dizisini yönetmek hem de veonDestroy()
ve yapılandırma değişiklikleri.
Yükleyiciler bu sorunları çözer ve diğer faydalarını sağlar:
- Yükleyiciler, yavaş veya yanıt vermeyen kullanıcı arayüzünü önlemek için ayrı iş parçacıkları üzerinde çalışır.
- Yükleyiciler, etkinlikler olduğunda geri çağırma yöntemleri sağlayarak iş parçacığı yönetimini basitleştirir meydana gelir.
- Yükleyiciler kalıcıdır ve yapılandırma değişiklikleri genelinde sonuçları önbelleğe alır yinelenen sorgular.
- Yükleyiciler, temeldeki değişiklikleri izlemek için bir gözlemci uygulayabilir ve
veri kaynağına da bakabilirsiniz. Örneğin,
CursorLoader
otomatik olarak yeniden yüklemeyi tetiklemek için birContentObserver
kaydeder hem de veriler değiştiğinde.
Loader API özeti
Birden fazla sınıf ve arayüz vardır. yükleyiciler görebilirsiniz. Bunlar aşağıdaki tabloda özetlenmiştir:
Sınıf/Arayüz | Açıklama |
---|---|
LoaderManager |
Bir FragmentActivity veya
Bir veya daha fazlasını yönetmek için Fragment
Loader örnek. Yalnızca bir tane
Etkinlik veya parça başına LoaderManager , ancak
LoaderManager birden fazla yükleyiciyi yönetebilir.
Bir yükleyiciden veri yüklemeye başlamak için şunlardan birini yapın:
|
LoaderManager.LoaderCallbacks |
Bu arayüz, aşağıdaki durumlarda çağrılan geri çağırma yöntemleri içerir:
yükleyici etkinlikleri gerçekleşir. Arayüz üç geri çağırma yöntemi tanımlar:
initLoader() veya
restartLoader() .
|
Loader |
Yükleyiciler, verileri yükler. Bu sınıf soyut ve sunuyor
temel sınıf olarak kabul edilir. Alt sınıfı doğrudan
Loader veya aşağıdaki yerleşik yazılımlardan birini kullanın
şu alt sınıflara dikkat edin:
|
Aşağıdaki bölümlerde, bu kampanyaları nasıl ve arayüzleri inceleyeceğiz.
Uygulamada yükleyicileri kullanma
Bu bölümde, Android uygulamalarında yükleyicilerin nasıl kullanılacağı açıklanmaktadır. kullanan bir uygulama genellikle şunları içerir:
FragmentActivity
veyaFragment
.LoaderManager
örneği.ContentProvider
tarafından desteklenen verileri yüklemek içinCursorLoader
. Alternatif olarak, kendi alt sınıfınızı /Loader
veyaAsyncTaskLoader
başka bir kaynaktan veri yükleyebilirsiniz.LoaderManager.LoaderCallbacks
için bir uygulama. Burası yeni yükleyiciler oluşturduğunuz ve mevcut referanslarınızı yönettiğiniz yerdir. .- Yükleyicinin verilerini görüntülemenin bir yolu (örneğin,
SimpleCursorAdapter
). - Bir veri kaynağı (ör.
ContentProvider
)CursorLoader
.
Yükleyici başlatın
LoaderManager
, FragmentActivity
içindeki bir veya daha fazla Loader
örneği yönetir veya
Fragment
. Etkinlik veya parça başına yalnızca bir LoaderManager
vardır.
Normalde
etkinliğin onCreate()
yöntemi veya parçanın içinde bir Loader
başlat
onCreate()
yöntemi. Siz
bunu şu şekilde yapın:
Kotlin
supportLoaderManager.initLoader(0, null, this)
Java
// Prepare the loader. Either re-connect with an existing one, // or start a new one. getSupportLoaderManager().initLoader(0, null, this);
initLoader()
yöntemi
şu parametrelere sahip olursunuz:
- Yükleyiciyi tanımlayan benzersiz bir kimlik. Bu örnekte kimlik
0
'dır. - Şu konumdaki yükleyiciye sağlanacak isteğe bağlı bağımsız değişkenler:
(bu örnekte
null
). - Satın alma işleminin sorunsuz bir şekilde
LoaderManager.LoaderCallbacks
yükleyici etkinliklerini raporlamak içinLoaderManager
çağrısı. Burada örnek olarak, yerel sınıfLoaderManager.LoaderCallbacks
arayüzünü uygular ve böylece bir referans iletir. kendisine,this
.
initLoader()
çağrısı, bir yükleyicinin
başlatıldı ve etkin. Bunun iki olası sonucu vardır:
- Kimlik tarafından belirtilen yükleyici zaten varsa, oluşturulan son yükleyici yeniden kullanılıyor.
- Kimlikle belirtilen yükleyici yoksa,
initLoader()
,LoaderManager.LoaderCallbacks
yöntemi:onCreateLoader()
. Burası, yeni bir yükleyici örneği oluşturmak ve döndürmek için kodu uyguladığınız yerdir. Daha fazla tartışma içinonCreateLoader
ile ilgili bölüme bakın.
Her iki durumda da, verilen LoaderManager.LoaderCallbacks
uygulaması, yükleyiciyle ilişkilendirilir ve
yükleyici durumu değişiklikleri. Bu aramanın olduğu yerde arayan kişi
durumu ve istenen yükleyici zaten var ve kendi
veri olduğunda sistem şu çağrıyı yapar: onLoadFinished()
initLoader()
sırasında hemen. Bunun için hazırlıklı olmanız gerekir. Bu geri arama hakkında daha fazla bilgi edinmek için
onLoadFinished
değerleridir.
initLoader()
yöntemi, oluşturulan Loader
değerini döndürür.
ancak bunun için bir referans yakalamanız gerekmez. LoaderManager
şunları yönetiyor
süresi otomatik olarak belirlenebilir. LoaderManager
gerektiğinde yüklenmeye başlar ve yüklenmeyi durdurur ve yükleyicinin durumunu korur
ve bunlarla ilişkili içerikler.
Daha önce de belirttiğimiz gibi, yükleyicilerle nadiren
doğrudan ekleyebilirsiniz.
Yükleme işlemine müdahale etmek için en sık LoaderManager.LoaderCallbacks
yöntemlerini kullanıyorsunuz.
belirli olaylar gerçekleştiğinde ortaya çıkar. Bu konuyla ilgili daha ayrıntılı bilgi için LoaderManager geri çağırmalarını kullanma bölümüne bakın.
Yükleyiciyi yeniden başlatma
initLoader()
kullandığınızda
bu öğe, varsa belirtilen kimliğe sahip mevcut bir yükleyiciyi kullanır.
Yoksa oluşturulur. Ancak bazen eski verilerinizi silmek istersiniz.
baştan başlayın.
Eski verilerinizi silmek için restartLoader()
hesabını kullanın. Örneğin,
SearchView.OnQueryTextListener
yeniden başlatmanın uygulanması
kullanıcının sorgusu değiştiğinde yükleyici. Yükleyicinin yeniden başlatılması gerekir.
yeni bir sorgu yapmak için düzeltilmiş arama filtresini
kullanabilmesini sağlar.
Kotlin
fun onQueryTextChanged(newText: String?): Boolean { // 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. curFilter = if (newText?.isNotEmpty() == true) newText else null supportLoaderManager.restartLoader(0, null, this) return true }
Java
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. curFilter = !TextUtils.isEmpty(newText) ? newText : null; getSupportLoaderManager().restartLoader(0, null, this); return true; }
LoaderManager geri çağırmalarını kullanma
LoaderManager.LoaderCallbacks
bir geri çağırma arayüzüdür
LoaderManager
ile etkileşimde bulunabilmesini sağlayan bir kod snippet'i ekleyin.
Yükleyiciler, özellikle de CursorLoader
,
durdurulduktan sonra verilerini muhafaza edebilir. Bu şekilde uygulamalar,
Böylece, etkinliğin veya parçanın onStop()
ve onStart()
yöntemleri genelinde veriler
kullanıcılar bir uygulamaya geri döndüğünde, verilerin
e-posta ile gönderilmesini beklemek zorunda
yeniden yükleyin.
Yeni bir yükleyicinin ne zaman oluşturulacağını bilmek ve uygulamaya ne zaman bu yükleyici olduğunu bildirmek için LoaderManager.LoaderCallbacks
yöntemlerini kullanırsınız
verilerini kullanmayı bırakmanızı öneririz.
LoaderManager.LoaderCallbacks
şunları içeriyor:
yöntemleri:
onCreateLoader()
: verilen kimlik için yeni birLoader
örneği oluşturur ve döndürür.
-
onLoadFinished()
: yüklenmesi bittiğinde, önceden oluşturulmuş bir yükleyicinin yüklemesi tamamlandığında çağrılır.
onLoaderReset()
: bir yükleyicinin, önceden oluşturulmuş bir yükleyici sıfırlanırken çağrıldığı ve dolayısıyla, veri mevcut değil.
Bu yöntemler aşağıdaki bölümlerde daha ayrıntılı olarak açıklanmıştır.
onCreateLoader
Bir yükleyiciye erişmeye çalıştığınızda (örneğin, initLoader()
aracılığıyla)
kimlikle belirtilen yükleyici mevcut. Başlamazsa LoaderManager.LoaderCallbacks
yöntemi (onCreateLoader()
) tetiklenir. Bu
yeni yükleyici oluşturacağınız yerdir. Bu genellikle bir CursorLoader
olsa da kendi Loader
alt sınıfınızı uygulayabilirsiniz.
Aşağıdaki örnekte, onCreateLoader()
geri çağırma yöntemi, oluşturucu yöntemini kullanarak bir CursorLoader
oluşturur.
ContentProvider
üzerinde sorgu gerçekleştirmek için gereken tüm bilgileri gerektirir. Özel olarak aşağıdakiler gereklidir:
- uri: Alınacak içeriğin URI'sı.
- projeksiyon: Döndürülecek sütunların listesi. Pas
null
tüm sütunları döndürür, bu da verimsizdir. - selection: hangi satırların döndürüleceğini belirten bir filtre,
SQL WHERE ifadesi olarak biçimlendirilmiştir (WHERE'in kendisi hariç). Pas
null
, belirtilen URI için tüm satırları döndürür. - selectionArgs: Seçime ? eklerseniz bunlar değeri, selectionArgs'deki değerlerle değiştirildikleri sıraya göre değiştirilir. seçim. Değerler dize olarak bağlıdır.
- sortSipariş: SQL olarak biçimlendirilmiş satırlar nasıl sıralanır?
ORDER BY koşulu (ORDER BY ifadesi hariç). Geçiliyor:
null
değeri, varsayılan sıralama düzenini kullanır. Bu düzen, sırasız olabilir.
Kotlin
// If non-null, this is the current filter the user has provided. private var curFilter: String? = null ... override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor> { // 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. val baseUri: Uri = if (curFilter != null) { Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, Uri.encode(curFilter)) } else { ContactsContract.Contacts.CONTENT_URI } // Now create and return a CursorLoader that will take care of // creating a Cursor for the data being displayed. val select: String = "((${Contacts.DISPLAY_NAME} NOTNULL) AND (" + "${Contacts.HAS_PHONE_NUMBER}=1) AND (" + "${Contacts.DISPLAY_NAME} != ''))" return (activity as? Context)?.let { context -> CursorLoader( context, baseUri, CONTACTS_SUMMARY_PROJECTION, select, null, "${Contacts.DISPLAY_NAME} COLLATE LOCALIZED ASC" ) } ?: throw Exception("Activity cannot be null") }
Java
// If non-null, this is the current filter the user has provided. String curFilter; ... 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 (curFilter != null) { baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(curFilter)); } 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"); }
onLoadBitti
Bu yöntem, önceden oluşturulmuş bir yükleyicinin yüklemesini tamamladığında çağrılır. Bu yöntemin, son veri yayınlanmadan önce çağrılacağı garanti edilir sağlanmış. Bu noktada, eski verileri geri alamazsınız. Ancak verileri yayınlamayın yükleyicinin sorumluluğu size aittir ve bununla ilgilenir.
Yükleyici, uygulamanın artık kullanılamadığını anladığında verileri serbest bırakır
anlamaktır. Örneğin, veri bir CursorLoader
imleçse
close()
numaralı telefonu kendiniz aramayın. İmleç buranın
bir CursorAdapter
içine yerleştirildiğinde, swapCursor()
yöntemini kullanın ve böylece
eski Cursor
, aşağıdaki örnekte gösterildiği gibi kapalı değildir:
Kotlin
private lateinit var adapter: SimpleCursorAdapter ... override fun onLoadFinished(loader: Loader<Cursor>, data: Cursor?) { // Swap the new cursor in. (The framework will take care of closing the // old cursor once we return.) adapter.swapCursor(data) }
Java
// This is the Adapter being used to display the list's data. SimpleCursorAdapter adapter; ... 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.) adapter.swapCursor(data); }
onLoaderSıfırla
Bu yöntem, önceden oluşturulmuş bir yükleyici sıfırlanırken çağrılır. Böylece, kullanılamamasına neden olur. Bu geri çağırma işlevi, verilerin ne zaman referansınızı kaldırabilirsiniz.
Bu uygulama,
swapCursor()
.
null
değerine sahip:
Kotlin
private lateinit var adapter: SimpleCursorAdapter ... override fun onLoaderReset(loader: Loader<Cursor>) { // 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. adapter.swapCursor(null) }
Java
// This is the Adapter being used to display the list's data. SimpleCursorAdapter adapter; ... 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. adapter.swapCursor(null); }
Örnek
Örneğin, aşağıdakileri içeren bir ListView
görüntüleyen Fragment
öğesinin tam uygulaması aşağıda verilmiştir:
kişi içerik sağlayıcısıyla ilgili sorgunun sonuçlarıdır. Sağlayıcıdaki sorguyu yönetmek için bir CursorLoader
kullanır.
Bu örnek, bir kullanıcının kişilerine erişmeye yönelik bir uygulamadan olduğu için,
manifesto, izni içermelidir
READ_CONTACTS
Kotlin
private val CONTACTS_SUMMARY_PROJECTION: Array<String> = arrayOf( Contacts._ID, Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS, Contacts.CONTACT_PRESENCE, Contacts.PHOTO_ID, Contacts.LOOKUP_KEY ) class CursorLoaderListFragment : ListFragment(), SearchView.OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> { // This is the Adapter being used to display the list's data. private lateinit var mAdapter: SimpleCursorAdapter // If non-null, this is the current filter the user has provided. private var curFilter: String? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Prepare the loader. Either re-connect with an existing one, // or start a new one. loaderManager.initLoader(0, null, this) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, 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 = SimpleCursorAdapter(activity, android.R.layout.simple_list_item_2, null, arrayOf(Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS), intArrayOf(android.R.id.text1, android.R.id.text2), 0 ) listAdapter = mAdapter } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { // Place an action bar item for searching. menu.add("Search").apply { setIcon(android.R.drawable.ic_menu_search) setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) actionView = SearchView(activity).apply { setOnQueryTextListener(this@CursorLoaderListFragment) } } } override fun onQueryTextChange(newText: String?): Boolean { // 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. curFilter = if (newText?.isNotEmpty() == true) newText else null loaderManager.restartLoader(0, null, this) return true } override fun onQueryTextSubmit(query: String): Boolean { // Don't care about this. return true } override fun onListItemClick(l: ListView, v: View, position: Int, id: Long) { // Insert desired behavior here. Log.i("FragmentComplexList", "Item clicked: $id") } override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor> { // 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. val baseUri: Uri = if (curFilter != null) { Uri.withAppendedPath(Contacts.CONTENT_URI, Uri.encode(curFilter)) } else { Contacts.CONTENT_URI } // Now create and return a CursorLoader that will take care of // creating a Cursor for the data being displayed. val select: String = "((${Contacts.DISPLAY_NAME} NOTNULL) AND (" + "${Contacts.HAS_PHONE_NUMBER}=1) AND (" + "${Contacts.DISPLAY_NAME} != ''))" return (activity as? Context)?.let { context -> CursorLoader( context, baseUri, CONTACTS_SUMMARY_PROJECTION, select, null, "${Contacts.DISPLAY_NAME} COLLATE LOCALIZED ASC" ) } ?: throw Exception("Activity cannot be null") } override fun onLoadFinished(loader: Loader<Cursor>, data: Cursor) { // Swap the new cursor in. (The framework will take care of closing the // old cursor once we return.) mAdapter.swapCursor(data) } override fun onLoaderReset(loader: Loader<Cursor>) { // 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) } }
Java
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 curFilter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Prepare the loader. Either re-connect with an existing one, // or start a new one. getLoaderManager().initLoader(0, null, this); } @Override public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, 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); } @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. curFilter = !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 (curFilter != null) { baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(curFilter)); } 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); } }
Diğer örnekler
Aşağıdaki örneklerde yükleyicilerin nasıl kullanılacağı gösterilmektedir:
- LoaderCursor: Önceki snippet'in tam sürümü.
- Kişi listesini alma:
almak için
CursorLoader
kullanan bir adım adım açıklamalı kılavuz verileri de değiştirebilirsiniz. - LoaderThrottle: Sayıyı azaltmak için kısıtlamanın nasıl kullanılacağına dair bir örnek İçerik sağlayıcının verileri değiştiğinde gerçekleştirdiği sorguların sayısı.