¿Por qué OnCreate () de Fragment se llama a veces antes de OnCreate de Activity ()?

Recientemente me encontré con un problema difícil de reproducir. El NPE se produce cuando un fragmento intenta inicializar ArrayAdapter con los datos de Activity. La lista predeterminada inicializada en el método onCreate de la actividad:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... mAccounts = new ArrayList<>(); // ... } @Override public List<Account> getAccounts(){ return mAccounts; } 

El fragmento crea un adaptador de lista también en su onCreate () :

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); setHasOptionsMenu(true); //mAccountProvider is an interface implemented by the activity mAccounts = mAccountProvider.getAccounts(); mAccountAdapter = new AccountAdapter(getActivity(), R.layout.account_list_item, mAccounts); } 

El NPE se produce dentro del AccountAdapter cuando se llama al método getCount () por defecto. La razón es que mAccounts es nulo. La cuestión aparece rara vez y no pude reproducirla.

¿Cuándo es posible que onCreate () del fragmento se llama antes de la actividad onCreate () ? Según el código fuente, onCreate () de Fragment se envía en onCreate () de la actividad . ¿Por qué es entonces llamado después de Actividad onCreate () ha terminado su ejecución?

La devolución de llamada de actividades no se llama después de los fragmentos; El Fragmento se llama durante la Actividad.

Inicializar mAccounts antes de llamar a super.onCreate() en Activity.onCreate()

onCreate() de tu fragmento puede ser llamado antes de que el método onCreate() de tu actividad haya terminado. Tiene la onActivityCreated() callback onActivityCreated() en su fragmento y onCreateView() . Puede utilizar cualquiera de ellos – se ejecuta después de onCreate método de actividad.

Este error puede reproducirse activando "No mantener actividades" en las opciones de desarrollador. He encontrado el problema similar también y solucionado usando la solución proporcionada por FunkTheMonk.

Recientemente se presentó al problema. Vea el seguimiento de la pila en la parte inferior.

Como FunkTheMonk ha dicho, el accidente se debe al hecho de que su código onCreate () personalizado en su Actividad (justo después de super.onCreate ()) se ejecuta después de su código onCreate () personalizado en su Fragmento (justo después de super.onCreate ))

Si realmente necesita que su devolución de llamada sea ejecutada de forma prometedora después de la actividad onCreate de toda la actividad, coloque los fragmentos de código en onActivityCreated() lugar de onCreate()

De lo contrario la condición mencionada ocurrirá cuando su memoria es baja y la actividad se recicla.

Según mi experiencia, cuando MyActivity envía una intención, la aplicación se bloquea una vez que regresé a MyFragment pulsando la tecla de retroceso.

 Caused by: java.lang.NullPointerException at MyFragment.onCreate(MyFragment.java:20) at android.support.v4.app.Fragment.performCreate(Fragment.java:1939) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1029) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1230) at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:2037) at android.support.v4.app.FragmentController.dispatchCreate(FragmentController.java:154) at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:289) at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:58) at MyActivity.onCreate(MyActivity.java:129) at android.app.Activity.performCreate(Activity.java:5248) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257) at android.app.ActivityThread.access$800(ActivityThread.java:139) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5086) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method) 

Puedo ser demasiado tarde para responder, pero todavía. Me encontré con esto hace unos días. Sucede cuando se utilizan fragmentos dinámicos y en el diseño se utiliza la etiqueta de fragmento para mostrar el fragmento. En su lugar, utilice un Layout (preferiblemente FrameLayout). Suponiendo que estuviera utilizando la biblioteca de fragmentos de soporte.

Vale la pena intentarlo.

  • Android DialogFragment desaparece después del cambio de orientación
  • OnCreate () llamado mientras se detiene la actividad (pero no se destruye). Sólo después de la instalación
  • ¿Cómo tratar los datos retenidos después de que la actividad llegue a primer plano cuando se utiliza más de una actividad?
  • Android Fragment onCreateView vs. onActivityCreated
  • Ver ciclo de vida del paginador y del fragmento
  • NsdManager no detiene el descubrimiento de servicio
  • ¿Puede algunos dibujar el ciclo de vida de Fragment y su FragmentActivity padre?
  • Liberar recursos en onPause en lugar de onDestroy
  • View.getContext devuelve null, ¿por qué?
  • Cancelar notificación después de que la aplicación se cierre desde el fondo
  • ¿Cuándo se llaman onSaveInstanceState () y onRestoreInstanceState (), exactamente?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.