: Kann nicht auf den LifecycleOwner der Fragmentansicht zugreifen, wenn getView () null ist, dh vor onCreateView () oder nach onDestroyView ()

8

Ich verwende Live-Daten in meiner Anwendung für alle Netzwerkanrufe und die Bearbeitung von Antworten.

In einem der Szenarien lädt meine Recycler-Ansicht einige Daten in den Ansichtsinhaber onBindund die Antwort aktualisiert die Benutzeroberfläche. Dazu muss ich lifecycleOwnerdem Beobachter ein zur Verfügung stellen .

Da die Recycler-Ansicht keinen eigenen Lebenszyklus-Eigentümer hat, verwende ich das übergeordnete Fragment dafür, indem ich es verwende, parentFragment.viewlifecycleOwneraber irgendwie gibt es einen Fehler aus.

Wie kann ein Ansichtsinhaber seine Instanz haben, wenn das übergeordnete Fragment keine Instanz hat?

viewModel.responseState.observe(parentFragment.viewLifecycleOwner, Observer {
    updateUI(it)
})

Schwerwiegende Ausnahme: java.lang.IllegalStateException: Zugriff auf den LifecycleOwner der Fragmentansicht nicht möglich, wenn getView () null ist, dh vor onCreateView () oder nach onDestroyView ()

Utkarsh Singh
quelle
1
Das Problem war, dass mein ViewHolder einige Daten vom Server abrief und nach Empfang der Antwort die tatsächlichen Daten für den Inhaber erstellt wurden, an die wiederum einige Beobachter angehängt wurden, die mithilfe des Lebenszyklusbesitzers des übergeordneten Fragments angehängt wurden. Wenn ich jedoch vom Fragment weg navigierte, während mein Ansichtsinhaber die Daten abrief, wurde die übergeordnete Fragmentansicht zerstört. Wenn der Ansichtsinhaber die Antwort erhielt und versuchte, den Beobachter mit dem Lebenszyklusbesitzer des übergeordneten Fragments zu verknüpfen, wird der oben genannte Fehler als ausgegeben Mit dem übergeordneten Fragment war keine Ansicht mehr vorhanden.
Utkarsh Singh

Antworten:

0

Die Lösung für mich wurde 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 Ansichtsmodell).

Trajce Arsovski
quelle
0

In der Dokumentation zu getViewLifecycleOwner ( ) glaube ich nicht, ich kann es besser erklären:

Die erste Methode, bei der der Zugriff auf den Ansichtslebenszyklus sicher ist, 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. Verwenden Sie 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;
}
pandey_shubham
quelle
-1

Die Lösung besteht, wie Sie kommentieren, darin, sicherzustellen, dass die Ansicht des Fragments nicht null ist. Dies ist mir mit einem Fragment in einem ViewPager passiert.

Emmanuel Guerra
quelle