2013-12-12 3 views
7

ein Fragment gegeben, die (viel) Daten aus der Datenbank einen Loader lädt.Android-Fragment - Verwenden des Lademanagers der Aktivität anstelle von Fragments. Ist es o.k?

Problem:

Ich habe einen Pager-Adapter, der das Fragment zerstört, wenn der Benutzer aus dem Reiter es hält weg bewegt und neu erstellt, wenn der Benutzer auf diese Register zurückkommt. Aufgrund dieser Erholung wird jedes Mal ein neuer Lader erstellt und die Daten werden jedes Mal geladen.

Frage:

zu vermeiden Um loader jedes Mal neu erstellt das Fragment erstellt wird, ist es ok getActivity.getSupportLoaderManager.initLoader(loaderId, null, false) im onActivityCreated Methode des Fragments zu benutzen?

ich es versucht habe, es getestet und es scheint gut zu funktionieren. Aber ich bin nicht überzeugt, dass es richtig ist.

+0

Ich kann kein Problem mit diesem Ansatz sehen. Stellen Sie sicher, dass Sie eindeutige IDs pro Fragment verwenden (es sei denn, Sie mit Wiederverwendung des gleichen Lader sind ok) –

+0

ich gemacht habe, dass die ID eindeutig ist. Es fühlt sich nicht richtig an. Denn wenn der Loader erstellt wird, registriert sich das Fragment selbst als Callback, und wenn das System das Fragment zerstört hat, lädt der Loader die Daten neu und versucht, die 'onLoadFinished()' Methode aufzurufen. – 500865

+0

'onLoadFinished' würde in der Aktivität aufgerufen werden, die das Fragment nachschlagen müsste. Es könnte dort sein oder nicht (in diesem Fall ignorieren Sie einfach das Ergebnis). Wie auch immer, ich habe jetzt eine richtige Antwort hinterlassen. –

Antwort

2

Eigentlich den Quellcode überprüft, erhalten Sie das gleiche tun werden.

Fragment.getLoaderManager:

/** 
* Return the LoaderManager for this fragment, creating it if needed. 
*/ 
public LoaderManager getLoaderManager() { 
    if (mLoaderManager != null) { 
     return mLoaderManager; 
    } 
    if (mActivity == null) { 
     throw new IllegalStateException("Fragment " + this + " not attached to Activity"); 
    } 


    mCheckedForLoaderManager = true; 
    mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, true); 
    return mLoaderManager; 
} 

mWho ist im Grunde die Fragment-ID.

final void setIndex(int index, Fragment parent) { 
    mIndex = index; 
    if (parent != null) { 
     mWho = parent.mWho + ":" + mIndex; 
    } else { 
     mWho = "android:fragment:" + mIndex; 
    } 
} 

Der Unterschied in Activity.getLoaderManager() ist, dass die (root)

So auch sein wird, obwohl Sie tun können, was Sie fordern, kann es direkt aus dem Fragment Aufruf

Haftungsausschluss: Ich habe nur den Quellcode in der neuesten Version, aber ich erwarte es nicht viel anders

0

Darf ich fragen, warum Sie nicht einfach das Fragment Halt sind sein? Es scheint, dass Sie den Loader im Fragment erstellen und das Fragment mit setRetainInstance (true) erstellen müssen. Denken Sie in diesem Fall daran, beim Hinzufügen des Fragments einen TAG anzugeben. diese Weise wird das Fragment sogar zu Aktivität Konfigurationsänderungen überleben wird und nur die Ansicht wird der Loader am Leben neu zu verlassen.

Verwandte Themen