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.
- Calcular la altura de mi teléfono
- Puntero de la cabeza FileOutputStream
- Entender la clase R en Android
- ¿Proguard mantiene nombres de clase?
- Parámetro de vista de Android para el método OnClickListener
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"); }
- utilizando nombres de clases variables en lugar de lotes de cláusulas if?
- Android - Activación del bloqueo de teclas del sistema (también llamada pantalla de bloqueo)
- Java enum ¿Puedo agregar un método de devolución?
- android.util.Base64 codificar / decodificar indicadores parámetro
- Android: liberación de la memoria asignada AnimationDrawable está utilizando hasta
- ¿Cómo puedo reproducir un archivo cif encriptado con ExoPlayer?
- Un problema Java de conmutación: las expresiones de caso deben ser expresiones constantes
- "Necesita usar un tema Theme.Appcompat ..." al probar ActionBarActivity, pero estoy
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.
- No se puede iniciar AVD en Android Studio 2.3
- ¿Cómo puedo modificar la sugerencia de uso de TalkBack para una vista que se puede hacer clic en Android?