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.
- GetExternalStorageDirectory () a getExternalFilesDir ()
- Cómo asignar AffineTransform de java a Matrix de Android?
- Envío de DatagramPacket sin conexión a Internet - Android
- Obtener Elementos de JSON Array Android
- Android: javac vs Dalvik
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"); }
- No se puede vincular a cocos2dx utilizando eclipse para android en OSX
- Cómo revertir la imagen vuelta de la cámara frontal en android?
- Predeterminación de destino en Ant
- Respetando el bloqueo de rotación en android
- LinearLayout llenado de derecha a izquierda
- Cómo pasar datos de la clase de hilo independiente a la actividad en Android
- Diferentes respuestas entre el sitio de Google y la API de Google
- Android Volley - Comprobación del estado de Internet
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?