¿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 () :
- Android: onDestroy () o un método similar en la clase Application
- Cuándo llamar a super.onPause ()?
- Diferencia entre onResume () y onResumeFragments ()
- Android Lifecycle - ActivityManager mata proceso -> Excepción al volver de fondo
- Android: cuando usar onStart (), onStop ()?
@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?
- cómo comprobar si una actividad implementa una interfaz después de onAttach (Activity activity) ha sido depreciada
- Permiso de Marshmallow: Componente Lifecycle
- Cómo manejar AsyncTask onPostExecute cuando se pausan para evitar IllegalStateException
- ¿Se puede reanudar una actividad de Android después de finalizar ()?
- Diferenciar entre Android matando la aplicación y el usuario deslizarlo en la lista de aplicaciones recientes
- Realizar una pausa de actividad que no se reanuda después de volver a crear el método
- ¿Cómo puedo saber que onCreateView ha sido llamado desde una clase externa?
- ¿Cómo conservar el oyente en el cuadro de diálogo personalizado abierto desde el fragmento?
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 en la aplicación de facturación DEVELOPER_PAYLOAD no viene a través de
- No puede ejecutar modo de depuración en android studio