oncreateloader loaders initloader getloadermanager cursorloader android android-fragments android-loadermanager

loaders - paquete de compatibilidad de Android-fragmento... no adjunto a la Actividad



loaders en android (4)

Hola, me enfrento a este problema: estoy usando el paquete de compatibilidad para usar el fragmento en la aplicación de Android (mínimo SDK 2.1).

A veces ocurre una excepción aleatoria en el fragmento y no puedo entender por qué. Esta es la traza de pila que recibo:

java.lang.IllegalStateException: Fragment FeedListFragment{438a54e8} not attached to Activity at android.support.v4.app.Fragment.getLoaderManager(Fragment.java:715) at com.myappli.ui.FeedListFragment.refreshUpdateDate(FeedListFragment.java:283) at com.myappli.ui.phone.FeedListActivity.onReceiveResult(FeedListActivity.java:277) at com.myappli.data.rssplayer.service.KTDetachableResultReceiver.onReceiveResult(KTDetachableResultReceiver.java:55) at android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:43) at android.os.Handler.handleCallback(Handler.java:587) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:4425) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) at dalvik.system.NativeStart.main(Native Method)

Aquí está el código correspondiente que estoy llamando en la clase Fragmento:

public class FeedListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>, FeedListCursorAdapterListener { ... public void refreshUpdateDate() { getLoaderManager().restartLoader(LAST_UPDATE_CURSOR_ID, null, this); } ... }

Aquí está el código de la actividad que llama al fragmento:

private FeedListFragment mCursorLoaderListFg; if (!isFinishing()) { mCursorLoaderListFg.refreshUpdateDate(); mCursorLoaderListFg.refreshDisplay(); mCursorLoaderListFg.hideLoadingArticles(); }

Aquí está el código fuente del fragmento para 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(mIndex, mLoadersStarted, true); return mLoaderManager; }

Aquí están los pasos de la aplicación antes de la caída:

  1. La actividad llama métodos en segundo plano.
  2. Los métodos de devolución de llamada se llaman en la actividad.
  3. En este método de devolución de llamada, la actividad llama al fragmento.
  4. El fragmento intenta iniciar algunos métodos (como getLoadManager ()) que necesitan actividad.
  5. El fragmento ya no está adjunto a la actividad => crash

Probamos dos correcciones:

  • prueba de actividad para verificar si la actividad está terminando (como el código anterior)
  • Prueba en el fragmento con el método isDetached.

¡¡¡Gracias por tu ayuda!!!

No dudes en pedirme más información si no estoy claro.


El fragmento se adjuntará a la actividad en el evento Fragment.onAttach (Activity). Su Actividad tiene que implementar un oyente, proporciona el Fragmento. Para asegurarse de que se llame a su método refreshUpdateDate () solo después del evento, onAttach () primero debe tomar la actividad como una implementación de escucha y, a continuación, llamar al método fragmentAttached () del oyente. Por lo tanto, se informará su actividad cuando se adjunte el fragmento y se pueda llamar a refreshUpdateDate (), por ejemplo, directo en fragmentAttached (). Consulte Creación de devoluciones de llamada de evento a la actividad .


Lo que funcionó para mí fue utilizar el detector de fragmentos del fragmento, agregar una función getActivity para él que devuelva la actividad del escucha de fragmentos (la actividad que creó el fragmento).

Ahora, cuando tengo una llamada que necesita la actividad, solo uso la función.


Resolví este problema cambiando mi clase de adaptador interno a la clase interna estática.

private static class MessagesAdapter extends CursorAdapter { ...

No estoy seguro de cómo explicar eso, pero está relacionado con el hecho de que deberíamos evitar el uso de una clase interna no estática como se recomienda here


Tuve un problema similar.

Intente usar isAdded() o isVisible() lugar de isDetached() . Desafortunadamente, isDetached() no parece funcionar como debería ...