: Es kann nicht auf den LifecycleOwner der Fragmentansicht zugegriffen werden, wenn getView() null ist, d. h. vor onCreateView() oder nach onDestroyView()
Lesezeit: 4 Minuten
Utkarsh Singh
Ich verwende Live-Daten in meiner Anwendung für alle Netzwerkanrufe und die Antwortverarbeitung.
In einem der Szenarios lädt meine Recycler-Ansicht einige Daten in die des Ansichtsinhabers onBind und die Antwort ist die Aktualisierung der Benutzeroberfläche. Dazu muss ich eine lifecycleOwner zum Beobachter.
Da die Recycler-Ansicht keinen eigenen Lebenszyklusbesitzer hat, verwende ich dafür das übergeordnete Fragment, indem ich verwende parentFragment.viewlifecycleOwner aber irgendwie gibt es einen Fehler.
Wie kann ein Ansichtshalter seine Instanz haben, wenn das übergeordnete Fragment keine Instanz hat?
Schwerwiegende Ausnahme: java.lang.IllegalStateException: Auf den LifecycleOwner der Fragmentansicht kann nicht zugegriffen werden, wenn getView() null ist, d. h. vor onCreateView() oder nach onDestroyView()
Das Problem bestand darin, dass mein ViewHolder einige Daten vom Server abholte und nach Erhalt der Antwort die eigentlichen Daten für den Halter erstellt wurden, der wiederum einige Beobachter hatte, die über den Lebenszyklusbesitzer des übergeordneten Fragments angehängt wurden. Wenn ich jedoch vom Fragment weg navigierte, während mein Viewholder die Daten abholte, wurde die übergeordnete Fragmentansicht zerstört, und als der Viewholder die Antwort erhielt und versuchte, den Beobachter mit dem Lebenszykluseigentümer des übergeordneten Fragments zu verknüpfen, wurde der oben genannte Fehler ausgegeben Es gab keine Ansicht mehr mit dem übergeordneten Fragment.
– Utkarsh Singh
21. November 2019 um 11:05 Uhr
pandey_shubham
Dies kann behoben werden, indem die Logik, die den Fehler auslöst, gegen Ende ausgelöst wird onCreateView(...) Rückruf (nicht onCreate(...) noch onAttach(...)).
In getViewLifecycleOwner() Dokumentation, ich glaube nicht, dass ich es besser erklären kann:
Die erste Methode, mit der sicher auf den Ansichtslebenszyklus zugegriffen werden kann, ist onCreateView(LayoutInflater, ViewGroup, Bundle) unter der Bedingung, dass Sie eine Nicht-Null-Ansicht zurückgeben müssen (eine IllegalStateException wird ausgelöst, wenn Sie auf den Ansichtslebenszyklus zugreifen, aber nicht zurückkehren eine Nicht-Null-Ansicht).
Der Ansichtslebenszyklus bleibt durch den Aufruf von onDestroyView() gültig. Danach gibt getView() null zurück, der Ansichtslebenszyklus wird zerstört und diese Methode löst eine IllegalStateException aus. Erwägen Sie die Verwendung von getViewLifecycleOwnerLiveData() oder FragmentTransaction.runOnCommit(Runnable), um einen Rückruf zu erhalten, wenn der Ansichtslebenszyklus des Fragments verfügbar ist.
public LifecycleOwner getViewLifecycleOwner() {
if (mViewLifecycleOwner == null) {
throw new IllegalStateException("Can't access the Fragment View's LifecycleOwner when "
+ "getView() is null i.e., before onCreateView() or after onDestroyView()");
}
return mViewLifecycleOwner;
}
Ich hatte das gleiche Problem und konnte es mit dem folgenden Code beheben. Überprüfen Sie einfach, ob die Ansicht null ist oder nicht
if ( view != null)
viewModel.responseState.observe(parentFragment.viewLifecycleOwner, Observer {
updateUI(it) })
Die Lösung für mich bestand darin, Code in onViewCreated zu schreiben, anstatt in onCreateView zu schreiben … und mein Problem wurde behoben.
Ich verwende es in meiner onViewCreated-Methode und erhalte auf einigen Geräten immer noch Fehler.
– Rohit Jakhar
15. März 2022 um 4:35
Dies funktionierte bei mir, als ich versuchte, einen Rückruf zu einem onBackPressedDispatcher hinzuzufügen
– Leonardo Sibela
13. März um 15:33
acarrell
Das Problem besteht darin, dass der Beobachter immer noch auf dem Elternkonto aktiv ist viewLifecycleOwner auch nachdem die Ansicht zerstört wurde (wenn Sie zum nächsten Fragment navigieren). Der zuverlässigste Weg, dies zu beheben, besteht darin, die Beobachter auszuschließen.
override fun onDestroyView()
viewModel.responseState.removeObservers(parentFragment.viewLifecycleOwner)
super.onDestroyView()
}
Für mich war die Lösung vereinfacht. Ich verwende separate Beobachter – einen für das Netzwerk, das Lifecycleowner aus der Hauptaktivität (oder nur aus einer beliebigen Aktivität) verwendet, und einen für die Fragmentansicht (Modellansicht, Modellansicht).
Sourav Rawat BCA
myModel.getOfflineData().observeForever(new Observer<List<indiaStateModel>>() {
@Override
public void onChanged(List<indiaStateModel> indiaStateModels) {
adapter = new stateAdapter(indiaStateModels);
recyclerView.setAdapter(adapter);
}
});
// Verwenden Sie diesen Beobachter für immer, wenn Sie diesen Fehler erhalten. // Dieser Fehler tritt hauptsächlich auf, wenn Sie versuchen, das Design Ihres Telefons von dunkel auf hell oder von hell auf dunkel zu ändern
Anuj Kumar Rai
Am besten zu verwenden Fluss() anstatt Lebensdaten()
Wenn Sie eine neue Frage haben, stellen Sie diese bitte, indem Sie auf die Schaltfläche „Frage stellen“ klicken. Fügen Sie einen Link zu dieser Frage hinzu, wenn dies zur Bereitstellung des Kontexts beiträgt. – Aus der Rezension
– Rishabh Deep Singh
14. September 2021 um 8:34
14530500cookie-check: Es kann nicht auf den LifecycleOwner der Fragmentansicht zugegriffen werden, wenn getView() null ist, d. h. vor onCreateView() oder nach onDestroyView()yes
Das Problem bestand darin, dass mein ViewHolder einige Daten vom Server abholte und nach Erhalt der Antwort die eigentlichen Daten für den Halter erstellt wurden, der wiederum einige Beobachter hatte, die über den Lebenszyklusbesitzer des übergeordneten Fragments angehängt wurden. Wenn ich jedoch vom Fragment weg navigierte, während mein Viewholder die Daten abholte, wurde die übergeordnete Fragmentansicht zerstört, und als der Viewholder die Antwort erhielt und versuchte, den Beobachter mit dem Lebenszykluseigentümer des übergeordneten Fragments zu verknüpfen, wurde der oben genannte Fehler ausgegeben Es gab keine Ansicht mehr mit dem übergeordneten Fragment.
– Utkarsh Singh
21. November 2019 um 11:05 Uhr