Yükleyiciler

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 ve onDestroy() 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 bir ContentObserver 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.

LoaderManager almak için getSupportLoaderManager() numaralı telefonu arayın etkinlikten veya parçadan çıkarır.

Bir yükleyiciden veri yüklemeye başlamak için şunlardan birini yapın: initLoader() veya restartLoader(). Sistem, aynı tam sayı kimliğine sahip bir yükleyicinin daha önce ve yeni bir yükleyici oluşturur ya da mevcut bir yükleyiciyi yeniden kullanır.

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:
  • onCreateLoader(int, Bundle): çağrısı yapıldığında, sistem yeni bir yükleyicinin oluşturulması gerektiğinde çağrılır. Kodunuzda, bir Loader nesnesi oluşturun ve bu nesneyi sisteme bakacağız.
  • onLoadFinished(Loader<D>, D): bir yükleyici veri yüklemeyi tamamladığında çağrılır. Normalde bu veriler kodunuzda kullanıcıya gösterilir.
  • onLoaderReset(Loader<D>): çağrılır. Önceden oluşturulmuş bir yükleyici sıfırlanırken, destroyLoader(int) veya etkinlik veya parçanın yok edilmesi, verilerinin kullanılamaz hale gelmesini sağlar. Kodunuzda, yükleyicinin verilerine yapılan tüm referansları kaldırın.
ziyaret edin. Etkinliğiniz veya parçanız genellikle bu arayüzü uygular ve telefon ettiğinizde kaydedilir 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:

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 şekildeLoaderManager.LoaderCallbacks yükleyici etkinliklerini raporlamak için LoaderManager çağrısı. Burada örnek olarak, yerel sınıf LoaderManager.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çin onCreateLoader 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:

  • 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ı.