Birden çok yükleyiciye sahip LoaderManager: doğru imleç yükleyiciye nasıl ulaşılır


116

Birden fazla Yükleyiciniz varsa doğru imleci nasıl elde edeceğiniz bana göre net değil. Aşağıdakilerle iki farklı Yükleyici tanımladığınızı varsayalım:

getLoaderManager().initLoader(0,null,this);
getLoaderManager().initLoader(1,null,this);

sonra onCreateLoader () 'da id'ye bağlı olarak farklı şeyler yaparsınız:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {

    if (id==0){
               CursorLoader loader = new CursorLoader(getActivity(),
            MaterialContentProvider.CONTENT_URI,null,null,null,null);
    }else{
               CursorLoader loader = new CursorLoader(getActivity(),
            CustomerContentProvider.CONTENT_URI,null,null,null,null);
            };
    return loader;
} 

çok uzak çok iyi. Ancak onLoadFinished () ' de doğru imleci nasıl elde edersiniz, çünkü doğru Cursoradapter için doğru İmleci tanımlamak için herhangi bir kimlik elde edemezsiniz.

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {


    mycursoradapter1.swapCursor(cursor);
    if(isResumed()){
        setListShown(true);
    }else {
        setListShownNoAnimation(true);
    }



}
//and where to get the cursor for mycursoradapter2

ya da yanılıyor muyum ve bu, bir parçadaki iki farklı imleç bağdaştırıcısı için sonuç almanın yanlış yoludur.


Bu gerçekten güzel bir soru! İyi soruldu ve oldukça incelikli bir konuya değiniyor. Çok özel.
Kurtis Nusbaum

7
Belirtmek gerekir ki var yükleyici döndürme türü beri, genel tür silme nedeniyle tüm yükleyiciler genelinde aynı olmadığı durumlarda, Java (bir arabirim uygulamak izin vermez ayrı işleyicisi sınıflarını kullanma LoaderCallbacksbirden fazla olan bu durumda) yazın. Sadece sizin durumunuzda işe yarıyor, çünkü her iki durumda da sonuç a Cursor.
Matthias

1
@Matthias Harika bahsetmiştin! Sadece farklı dönüş tipine sahip 2 yükleyiciye sahip olmayı düşünüyorum. Peki ya 2 farklı dönüş tipine sahip 2 yükleyici? 1 yükleyiciyle bir görev mi yerine iş parçacığı ile başka bir görev mi yapın?
Robert

@Robert Thread kullanmaya gerek yok. İki Loaders kullanabilirsiniz . Lütfen bu stackoverflow.com/a/20839825/2818583
AnV

Yanıtlar:


119

Loader sınıfının getId () adında bir yöntemi vardır . Umarım bu, yükleyiciyle ilişkilendirdiğiniz kimliği döndürür.


Teşekkürler Kurtis! Güzel! Deneyeceğim ama işe yaramasını bekleyeceğim. Ben de aynı fikirdeyim ama yükleyici nesnesine bakmadım. Bunun yerine imleç nesnesine bir göz attım ...
Kay Gladen

Loader.getID () ile çalışır! Bunu şu anda iki kez kontrol ettim. Harika!
Kay Gladen

2
Bunu iç / anonim sınıfları kullanarak yapmayı düşünüyorum, böylece her yükleyicinin geri çağırmaları alan kendi nesnesi olur.
Jords

@KurtisNusbaum, bu neden yanlış? İç sınıf, dış Aktivite ile birlikte yok edilir, bu yüzden bu bir hafıza sızıntısına veya herhangi bir şeye neden olmamalıdır. Aktiviteye güçlü bir referansı olan statik bir sınıf, anlamsal olarak bir iç sınıfa eşdeğerdir (bu, dış sınıfa yönelik örtük güçlü bir referansı korur)
Matthias

6
@Jords Teknik olarak doğru. Bunu tartışmıyorum. Ama arayabiliyorken neden bütün bu rigamarole yapıyorsun getId()?
Kurtis Nusbaum

32

Loader'ın getId () yöntemini kullanın :

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    switch (loader.getId()) {
        case 0:
            // do some stuff here
            break;
        case 1:
            // do some other stuff here
            break;
        case 2:
            // do some more stuff here
            break;
        default:
            break;
    }
}    

8

Yükleyicilerinizin sonucun sınıf türünden başka ortak bir yanı yoksa (burada :), her biri bir yükleyici işlemine ayrılmış Cursoriki ayrı LoaderCallbacksörnek (yalnızca Etkinlik / Parçanızdaki iki iç sınıf olarak) oluşturmakta daha iyi olursunuz. elmaları portakallarla karıştırmaya çalışmaktan çok.

Sizin durumunuzda, hem veri kaynağı hem de sonuç işleme farklı görünüyor, bu da mevcut senaryoyu tanımlamak ve onu uygun kod bloğuna göndermek için fazladan standart kod yazmanızı gerektiriyor.


Bir sorum var. Amacı, Activityuygulama LoaderCallbacksve geçen thisiçin getLoaderManager().initLoader()sağlamaktır LoaderManagerarasındaki iletişim kanalı olarak hareket eder Activityve Loaderüzeri LoaderCallbacks. Bu iletişim kanalı Activity, uygulamadan LoaderCallbacksziyade anonim iç sınıflar yarattığı için burada nasıl yaratılıyor ?
2016

3
İletişim kanalı LoaderCallbacks. Hiçbir şey Activitykendisini olduğu gibi kullanmayı gerektirmez LoaderCallbacks. İhtiyaç duyduğunuzda birden fazla iletişim kanalı oluşturmak daha kolaydır.
BladeCoder
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.