Raramente recibo este error al hacer una llamada a la API.
java.lang.IllegalStateException: Fragment not attached to Activity
Intenté poner el código dentro del isAdded()
método para verificar si el fragmento se agrega actualmente a su actividad, pero todavía rara vez recibo este error. No entiendo por qué sigo recibiendo este error. ¿Como puedo prevenirlo?
Se muestra un error en la línea
cameraInfo.setId(getResources().getString(R.string.camera_id));
A continuación se muestra el ejemplo de llamada API que estoy haciendo.
SAPI.getInfo(getActivity(),
new APIResponseListener() {
@Override
public void onResponse(Object response) {
cameraInfo = new SInfo();
if(isAdded()) {
cameraInfo.setId(getResources().getString(R.string.camera_id));
cameraInfo.setName(getResources().getString(R.string.camera_name));
cameraInfo.setColor(getResources().getString(R.string.camera_color));
cameraInfo.setEnabled(true);
}
}
@Override
public void onError(VolleyError error) {
mProgressDialog.setVisibility(View.GONE);
if (error instanceof NoConnectionError) {
String errormsg = getResources().getString(R.string.no_internet_error_msg);
Toast.makeText(getActivity(), errormsg, Toast.LENGTH_LONG).show();
}
}
});
android
android-fragments
android-activity
android-volley
android-lifecycle
Desarrollador de Android
fuente
fuente
Respuestas:
Este error ocurre debido al efecto combinado de dos factores:
onResponse()
oonError()
(que funciona en el hilo principal) sin saber siActivity
todavía está en primer plano o no. SiActivity
desapareció (el usuario navegó a otro lugar),getActivity()
devuelve nulo.Response
se expresa como una clase interna anónima, que implícitamente tiene una fuerte referencia a laActivity
clase externa . Esto da como resultado una pérdida de memoria clásica.Para resolver este problema, siempre debe hacer:
y también, use
isAdded()
en elonError()
método también:fuente
AsyncTask
s desde dentro de unActivity
, no hay una forma infalible de evitar los NPE '. Siempre existe la posibilidad de que el usuario se aleje de la corrienteActivity
mientras uno de los hilos está haciendo algo en segundo plano, y luego, cuando el hilo se completaonPostExecute()
oonResponse()
se llama, no hayActivity
. Todo lo que puede hacer es verificar las referencias nulas en varios puntos de su código, y eso no es a prueba de balas :)added
bandera booleana y si laActivity
instancia actual esnull
o no.El ciclo de vida del fragmento es muy complejo y está lleno de errores, intente agregar:
fuente
return mHost != null && mAdded;
: eso es lo que hay dentro del método fragment.isAdded (). Pensé que mHost es una actividad si la trazas, pero parece que mHost está dentro de FragmentActivity. Entonces, probablemente, tienes razón. ¿Alguna adición?Encontré el método isAdded () de Very Very Solution Solution , que es uno de los métodos de fragmentos para identificar que este fragmento actual está conectado a su Actividad o no.
podemos usar esto como en todas partes en la clase de fragmento como:
fuente
Excepción: java.lang.IllegalStateException: Fragment
DeadlineListFragment {ad2ef970} no adjunto a la actividad
Categoría: Ciclo de vida
Descripción : al realizar operaciones que requieren mucho tiempo en el subproceso en segundo plano (por ejemplo, AsyncTask), se ha creado un nuevo Fragmento mientras tanto, y se desconectó de la Actividad antes de que finalizara el subproceso en segundo plano. El código en el subproceso de la interfaz de usuario (p. Ej., OnPostExecute) invoca un Fragmento separado y genera dicha excepción.
Solucion de solucion:
Cancele el hilo de fondo al pausar o detener el Fragmento
Use isAdded () para verificar si el fragmento está adjunto y luego obtener getResources () de la actividad.
fuente
puedo llegar tarde pero ayudar a alguien ..... La mejor solución para esto es crear una instancia de clase de aplicación global y llamarla en el fragmento particular donde no se adjunta su actividad
como abajo
Aquí está la clase de aplicación
fuente
Este error puede ocurrir si está creando una instancia de un fragmento que de alguna manera no se puede instanciar:
En mi caso, me encontré con esto cuando intenté usar:
fuente
En uso de Fragment
isAdded()
Volverá verdadero si el fragmento está actualmente adjunto a Activity.Si quieres consultar dentro de la Actividad
Espero que ayude a alguien
fuente
Adopté el siguiente enfoque para manejar este problema. Creó una nueva clase que actúa como un contenedor para métodos de actividad como este
Ahora, donde sea que necesite acceder a recursos de fragmentos o actividades, en lugar de llamar directamente al método, uso esta clase. En caso de que la actividad
context
no lonull
sea, devuelve el valor del activo y en caso de quecontext
sea nulo, pasa un valor predeterminado (que también especifica el llamador de la función).Importante Esta no es una solución, es una forma efectiva de manejar este bloqueo con gracia. Debería agregar algunos registros en los casos en que obtenga una instancia de actividad como nula e intente solucionarlo, si es posible.
fuente
Esto sucede cuando el fragmento no tiene contexto, por lo que el método getActivity () devuelve nulo. compruebe si usa el contexto antes de obtenerlo, o si la Actividad ya no existe. use el contexto en fragment.onCreate y después de la respuesta de la API, generalmente este caso
fuente
A veces, esta excepción es causada por un error en la implementación de la biblioteca de soporte. Recientemente tuve que bajar de 26.1.0 a 25.4.0 para deshacerme de él.
fuente
Este problema ocurre cada vez que llama a un contexto que no está disponible o es nulo cuando lo llama. Esto puede ser una situación cuando está llamando al contexto del hilo de actividad principal en un hilo de fondo o al contexto del hilo de fondo en el hilo de actividad principal.
Por ejemplo, actualicé mi cadena de preferencias compartidas como la siguiente.
Y llamó a finish () justo después. Ahora lo que hace es que como commit se ejecuta en el hilo principal y detiene cualquier otro commit asíncrono si llega hasta que finalice. Entonces su contexto está vivo hasta que se completa la escritura. Por lo tanto, el contexto anterior es en vivo, lo que provoca el error
Por lo tanto, asegúrese de volver a comprobar su código si hay algún código que tenga este problema de contexto.
fuente