Android weakReference to Activity se anula mientras se está ejecutando la actividad

Estoy recibiendo una NullPointerException que no puedo entender por qué esto está sucediendo. MainActivityWeakReference.get () parece devolver null.

Así que mi conjetura es la actividad se recrea y la variable de referencia se establece en null una vez que la clase se carga y la referencia sólo se actualiza una vez que se llama el método onCreate. Pero lo que no entiendo es que estoy ocupado realizando instrucciones dentro de la actividad que la referencia hace referencia y sin embargo la referencia es nula.

Las actividades pueden coexistir por un breve momento y cómo puedo manejar esta situación. Para mí, parece que una simple comprobación nula no sería suficiente para resolver el problema. Tal vez debería llamar finish ();

public class MainActivity extends android.support.v7.app.AppCompatActivity { private WeakReference<AppCompatActivity> mainActivityWeakReference = null; @Override protected void onCreate(Bundle savedInstanceState) { mainActivityWeakReference = new WeakReference<AppCompatActivity>(this); } public void handleAction(UserAction userAction) { switch (userAction) { case UPDATE_UI: << ERROR HERE mainActivityWeakReference.get().getSupportFragmentManager().executePendingTransactions(); break; } } 

Mi rastro de la pila:

 java.lang.NullPointerException: Attempt to read from field 'android.os.Handler android.support.v4.ama' on a null object reference at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1476) at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:490) at za.co.entersekt.nedbank.MainActivity.handleAction(MainActivity.java:297) 

Más detalles añadidos:

 public abstract class FragmentManager { .... public boolean execPendingActions() { if (mExecutingActions) { throw new IllegalStateException("Recursive entry to executePendingTransactions"); } if (Looper.myLooper() != mActivity.mHandler.getLooper()) {<<FragmentManager.java:1476 throw new IllegalStateException("Must be called from main thread of process"); } 

Esto se debe a que por definición a weak reference is a reference that does not protect the referenced object from collection by a garbage collecton
Así que si necesita una instancia de actividad intente hacer getActivity() o getContext()

Mi solución es obtener la actividad, a través de un método de gancho:

 public class MainFragment extends Fragment implements.... //.... @Override public void onAttach(Activity activity) { super.onAttach(activity); activityWeakReference = new WeakReference<>((AppCompatActivity) activity); } 

Y sí, la actividad puede volver a crearse por varias razones, en ese punto la referencia débil se convierte en nula, y no tiene una referencia fuerte y por lo tanto elegible para la recolección de basura.

Si fuera a tener una referencia fuerte de toda la actividad no sería elegible para la recolección de basura, una fuga de memoria grave, retener en memoria más tiempo que lo que debería.

Las actividades gan se vuelven a crear por varias razones, algunas de ellas son: cambio de orientación, cambios de idioma e incluso cuando android decide hacer esto debido a alguna restricción de memoria.

  • ¿Cómo obtener el número seleccionado de NumberPicker?
  • Hacer clic en el elemento giratorio dentro de la ventana emergente causa WindowManager $ BadTokenException
  • JSONObject to String Android
  • Conversión de JSON a objeto Java mediante Gson
  • 'SourceSets' no se puede aplicar a la advertencia de 'groovy.lang.closure' en Android Studio
  • Consulta sqlite de Android para que coincida con la columna que contiene el texto
  • No se puede comprobar el botón de radio
  • Android: ¿Hay alguna manera de cambiar el idioma predeterminado de android a nuevo idioma?
  • Java.lang.RuntimeException: La aplicación "org.eclipse.ui.ide.workbench" no se pudo encontrar en el registro
  • ¿De dónde viene Enum.values ​​()?
  • No se puede actualizar la vista de lista de android en onPostExecute
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.