68

Así es como se presenta mi aplicación:¿onResume() llamado before onActivityResult()?

  1. onResume() se pide al usuario iniciar sesión
  2. Si usuario inicia sesión, puede seguir utilizando la aplicación 3. Si el usuario cierra la sesión en cualquier tiempo, quiero solicitar nuevamente el inicio de sesión

¿Cómo puedo lograr esto?

Aquí es mi MainActivity:

@Override 
    protected void onResume(){ 
     super.onResume(); 

     isLoggedIn = prefs.getBoolean("isLoggedIn", false); 

     if(!isLoggedIn){ 
      showLoginActivity(); 
     } 
    } 

Aquí es mi LoginActivity:

@Override 
     protected void onPostExecute(JSONObject json) { 
      String authorized = "200"; 
      String unauthorized = "401"; 
      String notfound = "404"; 
      String status = new String(); 

      try { 
       // Get the messages array 
       JSONObject response = json.getJSONObject("response"); 
       status = response.getString("status"); 

       if(status.equals(authorized)){ 
        Toast.makeText(getApplicationContext(), "You have been logged into the app!",Toast.LENGTH_SHORT).show(); 
        prefs.edit().putBoolean("isLoggedIn",true); 

        setResult(RESULT_OK, getIntent()); 
        finish(); 
       } 
       else if (status.equals(unauthorized)){ 
        Toast.makeText(getApplicationContext(), "The username and password you provided are incorrect!",Toast.LENGTH_SHORT).show(); 
        prefs.edit().putBoolean("isLoggedIn",true); 
       } 
       else if(status.equals(notfound)){ 
        Toast.makeText(getApplicationContext(), "Not found",Toast.LENGTH_SHORT).show(); 
        prefs.edit().putBoolean("isLoggedIn",true); 
       } 
      } catch (JSONException e) { 
       System.out.println(e); 
      } catch (NullPointerException e) { 
       System.out.println(e); 
      } 
     } 
    } 

Después de que el usuario ha iniciado la sesión correctamente:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) { 
      Toast.makeText(getApplicationContext(), "BOOM SHAKA LAKA!",Toast.LENGTH_SHORT).show(); 
     } 
    } 

El problema es, onResume() se llama beforeActivityResult() así que cuando el usuario ha iniciado sesión correctamente, mi actividad principal no se noti fied porque onResume() se llama primero.

¿Dónde está el mejor lugar para solicitar el inicio de sesión?

Respuesta

80

La llamada a onActivityResult ocurre antes onResume, en realidad (ver the docs). ¿Estás seguro de que realmente estás comenzando la actividad que querías con startActivityForResult y que estás configurando el resultado de la actividad invocada al RESULT_OK antes de devolver un valor a tu actividad? Intente simplemente poner una declaración Log en su onActivityResult para registrar ese valor y asegurarse de que reciba un golpe. Además, ¿dónde está configurando el valor de la preferencia isLoggedIn? Parece que debería establecerlo en true en su actividad de inicio de sesión antes de que regrese de todos modos, pero eso claramente no está sucediendo.

+0

estoy configurando isLoggedIn después de que el usuario haya iniciado sesión. Vea mi código actualizado. no estoy seguro de qué está mal? –

+0

tiene razón, onActivityResult() se está llamando antes onResume(). ¿No estoy seguro de por qué mis preferencias se están leyendo mal entonces? –

+6

agregó una confirmación() después de mi putBoolean. Hizo el truco. –

2

Es posible que desee considerar la posibilidad de abstraer el estado de inicio de sesión de la actividad. Por ejemplo, si un usuario puede publicar comentarios, deje que la acción onPost haga ping para el estado de inicio de sesión y vaya desde allí, en lugar de desde el estado de la actividad.

21

Con fragmentos, no es tan simple como llamar a onActivityResult() antes de llamar a onResume(). Si la actividad a la que está regresando fue descartada en el ínterin, encontrará que las llamadas a (por ejemplo) getActivity() desde onActivityResult() devolverán nulo. Sin embargo, si la actividad no se ha eliminado, una llamada al getActivity() devolverá la actividad que contiene.

Esta incoherencia puede ser una fuente de defectos difíciles de diagnosticar, pero puede verificar el comportamiento de su aplicación habilitando la opción de desarrollador "No mantener actividades". Tiendo a mantener esto activado, prefiero ver un NullPointerException en desarrollo que en producción.