2

Ich versuche, die standardmäßigen Android-Fragmente zusammen mit LiveData zu verwenden. Das Update wird durch Aktualisierungen in einer Raumdatenbank ausgelöst. Leider wird mein Beobachter nicht ausgelöst.LiveData ruft LifecycleRegistryOwner nicht auf, wenn das Standardfragment verwendet wird

Beispielcode:

public class MyListFragment extends Fragment implements LifecycleRegistryOwner { 

LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); 

@Override 
public LifecycleRegistry getLifecycle() { 
    return mLifecycleRegistry; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

// ... normal code 

    AppDatabase database = AppDatabase.getDatabase(getContext()); 
    LiveData<List<RssItem>> allRssItems = database.rssItemDao().getAllRssItems(); 
    allRssItems.observe(this, rssItems -> setListContent(rssItems)); 

}

Wenn ich die Lebenszyklus-Ereignisse zu ignorieren erzwingen zu, erhalte ich die Updates.

allRssItems.observeForever(new Observer<List<RssItem>>() { 
     @Override 
     public void onChanged(@Nullable List<RssItem> rssItems) { 
      Toast.makeText(getContext(), "Update", Toast.LENGTH_SHORT).show(); 
      setListContent(rssItems); 
     } 
    }); 

Kann jemand meinen Fehler finden? Ich verwende nicht das v4.Fragment, sondern das Standard-Android, aber da ich die Implementierung von LifecycleFragment in meinen Code kopiert habe, gehe ich davon aus, dass dies funktionieren sollte.

+2

Wahrscheinlich eine Variation zu [dieser Ausgabe] (https://issuetracker.google.com/issues/62160522). – CommonsWare

+0

Danke, Mark, das ist in der Tat das Problem. Durch die Verwendung der in https://issuetracker.google.com/issues/62160522#comment1 beschriebenen Problemumgehung wird das Problem gelöst. – vogella

Antwort

3

Der Kommentar von CommonsWare und der Link zum Bug lösen diese Frage. Für das Standardfragment müssen Sie die entsprechenden Lebenszyklusereignisse auslösen, z. B. lifecycleRegistry.handleLifecycleEvent (Lifecycle.Event.ON_PAUSE);

Verwandte Themen