Parçanın setini anlamaRetainInstance (boolean)


341

Belgelerden başlayarak:

public void setRetainInstance (boolean retain)

Bir parça örneğinin Etkinlik yeniden oluşturma işlemi boyunca (yapılandırma değişikliği gibi) korunup korunmayacağını kontrol edin. Bu sadece arka istifte olmayan parçalarla kullanılabilir. Ayarlanırsa, bir etkinlik yeniden oluşturulduğunda parça yaşam döngüsü biraz farklı olur:

  • onDestroy () çağrılmaz (ancak parça geçerli etkinliğinden ayrıldığı için onDetach () yine de olacaktır.
  • Parça yeniden oluşturulmadığından onCreate (Bundle) çağrılmaz.
  • onAttach (Activity) ve onActivityCreated (Bundle) çağrılır.

Birkaç sorum var:

  • Parça da görüşünü koruyor mu, yoksa bu yapılandırma değişikliğinde yeniden mi yaratılacak? "Alıkonan" tam olarak ne anlama geliyor?

  • Kullanıcı etkinlikten ayrıldığında parça imha edilecek mi?

  • Neden arka yığındaki parçalarla çalışmıyor?

  • Bu yöntemi kullanmanın mantıklı olduğu kullanım durumları nelerdir?


Yanıtlar:


348

Her şeyden önce, yazıma bir göz at muhafaza Fragments üzerinde. O yardımcı olabilir.

Şimdi sorularınızı cevaplamak için:

Parça aynı zamanda görüş durumunu koruyor mu veya konfigürasyon değişikliğinde yeniden yaratılacak mı - tam olarak "korunuyor" nedir?

Evet, Fragment'ın durumu yapılandırma değişikliği boyunca korunur. Özellikle, "muhafaza", parçanın yapılandırma değişikliklerinde yok edilmeyeceği anlamına gelir . Yani, Fragmentedilecektir tutulan yapılandırma değişikliği altında yatan neden olsa bile Activityimha edilecek.

Kullanıcı etkinlikten ayrıldığında parça imha edilecek mi?

Tıpkı Activitys gibi , Fragmentbellek kaynakları az olduğunda sistem tarafından yok edilebilir. Parçalarınızın yapılandırma durumlarında örnek durumlarını korumasına sahip olup olmamanız, sistemden Fragmentayrıldıktan sonra sistemin s'yi yok edip etmeyeceği üzerinde bir etkisi olmayacaktır Activity. Activity(Yani ana sayfa düğmesine basarak) çıkarsanız , Fragments yok edilebilir veya edilmeyebilir. ActivityGeri düğmesine basarak ayrılırsanız (böylece, arama finish()ve etkili bir şekilde yok etme Activity), Activityekli olanların tümü Fragmentde yok edilir.

Neden arka yığındaki parçalarla çalışmıyor?

Orada o desteklenmeyen neden birden çok nedeni muhtemelen, ama bana en belirgin nedeni olduğunu Activitybir başvuru tutan FragmentManagerve FragmentManagerbackstack yönetir. Diğer bir deyişle, bilgilerinizi korumayı Fragmentveya korumamayı seçerseniz seçin , Activity(ve böylece FragmentManager'backstack'i) bir yapılandırma değişikliğinde imha edilir. Her iki parçaları kalmış eğer işler zor olsun çünkü neden bu işi olmayabilir diğer bir nedeni ve olmayan tutulan parçaları aynı backstack mevcut izin verildi.

Bu yöntemi kullanmanın mantıklı olduğu kullanım durumları nelerdir?

Tutulan fragmanlar, durum bilgilerinin - özellikle iş parçacığı yönetiminin - etkinlik örnekleri arasında yayılması için oldukça yararlı olabilir. Örneğin, bir parça , işleyişinin bir örneği Threadya da AsyncTaskyönetimi için bir ana bilgisayar işlevi görebilir. Bkz benim blog yazısı fazla bilgi için bu konudaki .

Genel olarak, bir oryantasyon değişikliğini doğru bir şekilde uygulamak / işlemek için çok tembel olduğunuz için onConfigurationChangedbir Activity... ile bandaj gibi kullanmayın. Sadece ihtiyacınız olduğunda kullanın.


37
Görünüm nesneleri korunmaz, yapılandırma değişikliklerinde her zaman yok edilirler.
Markus Junginger

103
Bildiğim kadarıyla varsa ben söyleyebilirim setRetainInstance(true), Fragmentjava nesnesi, ve tüm içeriği olan değil dönme imha, ancak görünüm almaktadır yeniden. Buna onCreatedView()tekrar denir. Temel olarak ActivitiesAndroid 1.0'dan bu yana birlikte çalışması gerekiyordu . Bunu kullanmak için "tembel" olduğunu düşünmüyorum, ya da kullanmak "uygun" değildir. Aslında bunun neden varsayılan olmadığını veya neden hiç istemediğinizi göremiyorum.
Timmmm

24
"Neden arka yığındaki parçalarla çalışmıyor?" anlaması zor. Ama belki aptalım :(
HGPB

13
@dierre Bir etkinlik birçok şekilde yok edilebilir. Örneğin, "geri" yi tıklarsanız etkinlik yok olur. "Ev" i tıklatırsanız, etkinlik durdurulacak ve gelecekte bellek azaldığında bir süre sonra yok edilebilir. Tutulanlar Fragmentyalnızca temeldeki etkinliğin yok edileceği ve hemen yeniden oluşturulacağı yapılandırma değişikliklerinde korunur. Faaliyetin yok edildiği diğer tüm durumlarda, tutulan parçalar da yok edilecektir.
Alex Lockwood

3
@AlexLockwood aşağıdaki teyit ediniz edebilirsiniz: rağmen setRetainInstance(true)kullanılan, biri hala zorundadır (kendi kalıcılığı uygulamaya savedInstanceStateveya başka) bütün senaryoları değerlendirmeye muktedir: örneğin "ev anahtarı, döndürme, geri app" yapıcı ile benim parçasını yeniden oluşturur çağrı, tüm durum değişkenlerini kaybetme. Bir var AsyncTaskben tutmak istiyorum neden kullanıcı geri geldiğinde ben devlet tasarrufu, görevi durdurmak zorunda kaldı ve devam ediyorum çalışmak istiyorlarsa, şimdi, var üye değişkeni gibi. Sonuçta, bu rotasyona yardım etmenin hızlı bir yoludur, ancak genel olarak işe yaramaz.
TWiStErRob

28

setRetaininstanceyalnızca activitybir yapılandırma değişikliği nedeniyle imha edilip yeniden oluşturulduğunda faydalıdır, çünküonRetainNonConfigurationInstance . Yani, cihazı döndürürseniz, tutulan parçalar orada kalır (yok edilmez ve yeniden yaratılmazlar), ancak çalışma zamanı kaynakları geri almak için etkinliği öldürdüğünde, hiçbir şey kalmaz. Geri düğmesine basıp etkinlikten çıktığınızda, her şey yok edilir.

Genellikle bu işlevi zaman tasarrufu değiştirerek kaydetmek için kullanıyorum.Sunucu bir grup Bitmap'i sunucudan indirebilirim ve her biri 1MB'dir, kullanıcı cihazını yanlışlıkla döndürdüğünde, kesinlikle tüm indirme işlerini tekrar yapmak istemiyorum. Ben oluşturmak Fragmentbenim bitmap'leri tutup yöneticisi ve görüşmesine ekleyin setRetainInstance, tüm bitmapler hala orada bile ekran yönü değişirse.


Bitmap'leriniz için bir tutucu olarak "Yalnızca Veri" parçaları (herhangi bir widget olmadan) mı oluşturuyorsunuz yoksa bu parçaların da widget'ları olabilir mi? Parça bağlam / Etkinlik ile ilgili bir şey içerdiğinde bellek sızıntısı üretme tehlikesi hakkında bir şey okudum ...
hgoebl

Çerçeve mActivitysizin için referansı temizleyecektir . Ama bu durumda çalışma zamanının parça örneğindeki widget'ları da temizleyip temizlemeyeceğini bilmiyorum. Lütfen deneyin veya kaynak koduna dalın.
suitianshi

Biz setRetaininstance ne zaman kullanabileceğini Nice örneği
Mu Sa

12

SetRetainInstance (true), parçanın hayatta kalmasına izin verir. Üyeleri, döndürme gibi yapılandırma değişikliği sırasında korunur. Ancak, etkinlik arka planda öldürüldüğünde hala öldürülebilir. Arka planda bulunan etkinliğin sistem tarafından öldürülmesi durumunda, bu instanceState öğesi ,SaveInstanceState üzerinde düzgün şekilde işlediğiniz sistem tarafından kaydedilmelidir. Başka bir deyişle onSaveInstanceState her zaman çağrılır. SetRetainInstance doğruysa ve parça / etkinlik henüz öldürülmediyse onCreateView çağrılmasa da, öldürülüp geri getirilmeye çalışılırsa çağrılır.

İşte android aktivite / fragman yardımcı olur bazı analiz vardır. http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html


8
Ekranı döndürürken kesinlikle tutulan parça üzerinde tekrar çağrılıyor onCreateView görüyorum.
aij

Bu bağlantı kendi blogunuz mu? Durum buysa bunu açıkça belirtmelisiniz.
Flekso

4

setRetainInstance () - Kullanımdan kaldırıldı

Parçalar Versiyonu 1.3.0-alpha01 olarak

Fragments üzerindeki setRetainInstance () yöntemi kullanımdan kaldırıldı. ViewModels'ın piyasaya sunulmasıyla birlikte, geliştiricilerin Etkinlikler, Parçalar ve Gezinme grafikleriyle ilişkilendirilebilecek durumu korumak için belirli bir API'si vardır. Bu, geliştiricilerin normal, alıkonmayan bir Parçayı kullanmalarını ve korunmasını istedikleri belirli durumu ayrı tutmalarını sağlayarak, alıkonan durumun tek bir yaratılmasının ve imhasının yararlı özelliklerini korurken (yani, ViewModel'in kurucusu) ve aldığı onCleared () geri çağrısı).


2

setRetainInstance (boolean) , Etkinlik yaşam döngüsüne bağlı olmayan bir bileşene sahip olmak istediğinizde kullanışlıdır. Bu teknik, örneğin rxloader tarafından " burada bulduğum ) rxjava'nın Gözlemlenebilirliği için Android'in etkinlik yaşam döngüsünü ele almak için kullanılır .

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.