SORU
21 Ocak 2013, PAZARTESİ


`İnitLoader` ve `restartLoader` LoaderManager arasındaki fark`

Tamamen initLoader ve LoaderManager. restartLoader fonksiyonları arasındaki farklar ile ilgili kayboldum

  • İkisi de aynı imza var.
  • restartLoader ya da eğer varsa bir yükleyici oluşturur, ("yeni veya yeniden bu yöneticisi, varolan bir Loader") Başlar.

İki yöntem arasında bir ilişki var mı? Yok restartLoader initLoader arama? initLoader aramak zorunda kalmadan restartLoader diyebilir miyim? initLoader verileri yenilemek için iki kez çağrı kurtarmak için mi? Ne zaman kullanmalı mıyım iki ve (önemli!) neden?

CEVAP
4 Ocak 2014, CUMARTESİ


Bu cevap için LoaderManager kodu kazmak gerekir soru. LoaderManager belgelerine kendisi yeterince açık (ya da bu soru olmazdı) olmasa da, LoaderManagerİmpl belgelerine, soyut LoaderManager bir alt sınıfı, çok daha aydınlatıcı.

initLoader

Bir Loader ile belirli bir KİMLİK başlatmak için arayın. Bu KİMLİĞİ zaten bir Loader değişmeden kalır onunla ilişkili, ve herhangi bir önceki var geri yeni sağlanan olanlar ile değiştirildi. Eğer değilse orada şu anda KİMLİĞİ için bir Yükleyici, yeni bir tane oluşturulur ve başlatılır.

Bu işlev, genellikle bir bileşen olduğunda kullanılmalıdır başlatılıyor, dayandığı bir Loader oluşturulan emin olmak için. Bu yeniden kullanım eğer zaten bir tane varsa,varolan bir şeydir verileri sağlar yani örneğin bir Aktivite silinmeli, sonra bir yapılandırma yeniden oluşturmak için onun yükleyiciler gerekmez değiştirin.

restartLoader

Yeniden oluşturmak için Yükleyici belirli bir KİMLİK ile ilişkili diyoruz. Eğer şu anda bir Loader bu KİMLİĞİ olacak ile ilgili iptal//uygun olarak imha durdu. Yeni bir Loader verilen değişkenleri ve verileri bir kere teslim oluşturulur mevcut.

[...] Bu fonksiyon, herhangi bir önceki Yükleyiciler bu ID ile ilgili arama sonra geçersiz sayılacak, ve daha fazla veri alırsınız onlardan güncellemeleri.

Temel olarak iki durum vardır:

  1. Yükleyici kimliği ile yok: her iki yöntem de yok fark var yok o yüzden yeni bir yükleyici oluşturur
  2. Zaten kimliği ile loader: initLoader sadece geri, parametre olarak geçirilen yerini alacak ama ya yükleyiciyi iptal durmayacak. İmleç açık ve aktif ise o initLoader görüşme öncesi durumda () kalıyor demektir CursorLoader için. restartLoader diğer yandan, iptal, durdurmak ve yok loader (ve yakın temel veri kaynağı gibi bir imleç) ve create a new loader (hangi ayrıca yeni bir imleç ve yeniden çalıştırın, sorgu eğer yükleyici bir CursorLoader).

İşte her iki yöntem için basitleştirilmiş kodu:

initLoader

LoaderInfo info = mLoaders.get(id);
if (info == null) {
    // Loader doesn't already exist -> create new one
    info = createAndInstallLoader(id, args, LoaderManager.LoaderCallbacks<Object>)callback);
} else {
   // Loader exists -> only replace callbacks   
   info.mCallbacks = (LoaderManager.LoaderCallbacks<Object>)callback;
}

restartLoader

LoaderInfo info = mLoaders.get(id);
if (info != null) {
    LoaderInfo inactive = mInactiveLoaders.get(id);
    if (inactive != null) {
        // does a lot of stuff to deal with already inactive loaders
    } else {
        // Keep track of the previous instance of this loader so we can destroy
        // it when the new one completes.
        info.mLoader.abandon();
        mInactiveLoaders.put(id, info);
    }
}
info = createAndInstallLoader(id, args,  (LoaderManager.LoaderCallbacks<Object>)callback);

Loader == null ınfo () yöntemleri yeni bir yükleyici oluşturur yok diye gördüğünüz gibi (info = (...) createAndİnstallLoader). Durumda loader zaten initLoader sadece var değiştirir geri aramalar (bilgi.= ...) mCallbacks restartLoader ederken, eski loader (yeni loader işini tamamladığında telef olacak) devre dışı bırakır ve sonra yeni bir tane oluşturur.

Böylece artık restartLoader kullanmak initLoader ve anlamlı iki yöntem var, neden kullanmak için ne zaman açık olduğunu söyledi. initLoader başlatılmış bir loader var sağlamak için kullanılır. Eğer yok yeni bir tane oluşturulur varsa, Eğer zaten varsa, yeniden kullanılır. Biz her zaman bu yöntemi kullanın SÜRECE ihtiyacımız var yeni loader çünkü sorguyu çalıştırın değişti (temel veri ama gerçek sorgu gibi SQL deyim için bir CursorLoader durumda, arayacağız restartLoader.

Faaliyet/Parça yaşam döngüsü ile bir ilgisi yok karar için kullanabileceğiniz bir diğer yöntem (ve gerek yok kaydını tutmak çağrılarını kullanarak bir kerelik bir bayrak gibi Simon önerilen)! Bu karar sadece "" yeni bir loader için. gereken dayalı yapılır Eğer initLoader kullanıyoruz aynı sorguyu çalıştırmak istiyorsak, eğer farklı bir sorgu çalıştırmak istiyorsak restartLoader kullanıyoruz. Her zaman restartLoader kullanabiliriz ama bu verimsiz olurdu. Sonra ekran döndürme ya da eğer kullanıcı gider uzak app verir ve daha sonra aynı Etkinliği genellikle göstermek istiyorum aynı sorgu sonucu ve restartLoader ki gereksiz yere yeniden yükleyiciyi kapatmak ve temel (potansiyel pahalı) sorgu sonucu.

Çok önemli yüklendi ve "yük veri. bu sorgu verileri arasındaki farkı anlamak. Hadi bir CursorLoader siparişler için bir tablo sorgulama kullanıyoruz varsayalım. Eğer yeni bir düzen CursorLoader kullanır onContentChanged bu tabloya eklenirse() uı ve yeni düzen (bu durumda restartLoader kullanmaya gerek yok) güncelleme göstermek için bilgilendirmek. Eğer sadece açık siparişler görüntülemek istersek yeni bir sorgu ihtiyacımız var ve restartLoader yeni bir CursorLoader yeni sorgu yansıtan dönmek için kullanırız.

İki yöntem arasında bir ilişki var mı?

Kodu yeni bir Yükleyici oluşturmak için paylaşıyorlar ama loader zaten var, farklı şeyler yapıyorlar.

Arama restartLoader her zaman initLoader diye hitap ediyor?

Hiç Yok.

İnitLoader aramak zorunda kalmadan restartLoader diyebilir miyim?

Evet.

Güvenli initLoader iki kat daha fazla veri yenileme için aramak istiyorum.

Güvenli initLoader iki kez arama oldu ama hiçbir veri yenilenir.

Ne zaman kullanmalı mıyım iki ve (önemli!) neden?

(Umarım) benim yukarıdaki açıklamalar sonra açık olmalıdır.

Yapılandırma değişiklikleri

Bir LoaderManager bize yapacak bir şey kalmamış sanırım. o yüzden sen yapılandırma değişiklikleri (yönlendirme değişiklikleri de dahil olmak üzere) boyunca durumunu korur. Tekrar düşünün...

Öncelikle bir LoaderManager değil korumak geri aramalar, eğer öyleyse hiç bir şey yapmayacaksın değil aramalar için geri arama yöntemleri gibi onLoadFinished() gibi ve bu çok büyük olasılıkla mola uygulaması. Bu nedenle en azından initLoader geri arama yöntemleri (bir restartLoader tabi ki olabilir de) geri çağırmalıyız. documentation devletler:

Ara arayan başlamış durumda ve bu noktada eğer zaten var loader istenen ve veri üretti, sonra geri arama onLoadFinished(Yükleyici, D) hemen çağrılır (iç bu işlevi) [...].

Eğer bir oryantasyon değişiklikten sonra initLoader, verileri zaten (bu değişiklikten önce olduğu varsayımıyla) yüklü olduğu için onLoadFinished bir ara hemen alacağız demektir. Bu yalındır sesler olsa da zor (biz tüm Android aşk değil...) olabilir.

İki dava arasında bir ayrım yapmak zorunda:

  1. Kendisi yapılandırma değişiklikleri işler: bu Parçalar için geçerlidir bu kullanım setRetainİnstance(true) veya bir Etkinlik için android göre:bildirimde etiketi configChanges. Bu bileşenler, örneğin, sonra onCreate çağrı almazsınız ekran döndürme, akılda aramak için Devam Et initLoader/başka bir geri arama yöntemi (örneğin içinde restartLoader onActivityCreated(Bundle)). Yükleyici(ler) başlatmak için muktedir loader kimlikleri saklanır (örn gerekiyor. Çünkü bileşen edebiliriz yapılandırma değişiklikleri boyunca korunur sadece mevcut loader kimlikleri ve aşkın bir döngü(loaderid,initLoader ...).
  2. Yapılandırma değişiklikleri kendini ele vermez: bu dava İçinde Yükleyiciler ama elle gerekiyor onCreate içinde başlatılabilir loader kimliklerini korumak veya gerekli yapmak mümkün olmayacaktır /restartLoader aramalar initLoader. Kimlikleri bir depolanırsa ArrayList, bir şey yapmayız
    outState.putİntegerArrayList(loaderİdsKey, loaderİdsArray) onCreate içinde onSaveİnstanceState ve geri kimlikleri: loaderİdsArray = savedİnstanceState.getİntegerArrayList(loaderİdsKey) biz yapmadan önce initLoader çağrı(ler).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Disney Pets and Animals

    Disney Pets

    29 ŞUBAT 2012
  • lifeisforsharingDT

    lifeisforsha

    18 Mayıs 2011
  • Matthew Pearce

    Matthew Pear

    9 AĞUSTOS 2009