2011-09-28 12 views
8

estoy teniendo un extraño problema con mi aplicación -Fragmento onStop() llamado directamente después de onStart() - ¿POR QUÉ?

A tienen una actividad fragmento que contiene un fragmento - Este fragmento se inicia un onCreate AsyncTask() y cancela la AsyncTask onStop(). Mi problema surge porque, aunque mi Fragmento sigue ejecutándose & no se oscurece, se llama a OnStop() casi de manera directa después de que está enCreate().

¿Alguien sabe cómo rastrear por qué esto estaría sucediendo?

09-28 11:41:56.785: VERBOSE/SearchFragment1(924): onCreate() 
09-28 11:41:56.796: VERBOSE/SearchFragment1(924): onStop() 

EDITAR

He quitado el código a partir del fragmento y todavía estoy absolutamente desconcertado - El problema persiste! He agregado algunas líneas más de registro:

09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onAttach() 
09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onCreate() 
09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onCreateView() 
09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onActivityCreated() 
09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onStart() 
09-28 14:09:00.246: VERBOSE/SearchResultsFragment1(1789): onStop() 
09-28 14:09:00.246: VERBOSE/SearchResultsFragment1(1789): onStart() 
09-28 14:09:00.246: VERBOSE/SearchResultsFragment1(1789): onResume() 

El comportamiento anterior es ... desconcertante. El código utilizado en la actividad es el siguiente:

if(savedInstanceState == null) 
{ 
    try { 
     FragmentTransaction transaction= getSupportFragmentManager().beginTransaction();  
     Fragment currentFragment= (Fragment)Class.forName(getIntent().getAction()).newInstance(); 
     transaction.replace(R.id.singlePane, currentFragment); 
     transaction.commit(); 
    } catch ... 

Este es el fragmento en su forma actual durante la depuración:

private static final boolean LOGGING_ENABLED = true; 
private static int global_creation_count = 0; 
private int local_count = global_creation_count; 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onAttach()"); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    global_creation_count+=1;  
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onCreate()"); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onCreateView()"); 
    return super.onCreateView(inflater, container, savedInstanceState);  
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, 
    "onActivityCreated()"); 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onStart()"); 
}  

@Override 
public void onResume() { 
    super.onResume(); 
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onResume()"); 
} 

// Fragment is active 

@Override 
public void onPause() { 
    super.onPause(); 
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onPause()"); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onStop()"); 
} 

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onDestroyView()"); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onDestroy()"); 
} 

@Override 
public void onDetach() {  
    super.onDetach(); 
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onDetach()"); 
} 

Edit2

A partir del código parece que el onStop () se está llamando directamente después de onStart(). He intentado ver si se está llamando al mismo tiempo que onStart() al agregar un Thread.sleep (1000) en onCreateView(). El resultado es el mismo, lo que me hace pensar que onStop() se está llamando/causando directamente desde el proceso de creación del Fragmento.

Edit3

StackTrace al romper el onStop(): enter image description here

Voy a tratar de colocar el código fuente y el paso a través de descubrir dónde está el problema.

Respuesta

8

Todavía no sé lo que estaba tratando de hacer ... Investigué en dónde obtener el código fuente para la clase involucrada en llamada a Ontop() y encontré que la fuente para android-support-v4.jar viene empaquetado junto con el jar en el SDK.

Después de conectar esta fuente, pronto descubrí que no estaba sincronizada y que mi android-support-v4.jar era muy diferente de la que se entrega con la versión actual del SDK.

Reemplazar el contenedor con el que está empaquetado con el SDK soluciona el problema instantáneamente y no se invoca a onStop() después de onStart(). No estoy seguro de qué error estaba causando esto, pero la última versión parece solucionarlo bastante bien.

+0

Gracias, esto me causaba mucho dolor. Supongo que era un error en una versión anterior de la biblioteca de soporte. – Tom

Cuestiones relacionadas