68

Voici comment mon application est aménagé:OnResume() est-il appelé avant onActivityResult()?

  1. utilisateur onResume() est invité à se connecter
  2. Si l'utilisateur se connecte, il peut continuer à utiliser l'application 3. Si l'utilisateur se connecte à tout temps, je veux inviter l'ouverture de session à nouveau

Comment puis-je y parvenir?

Voici mon MainActivity:

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

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

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

Voici mon 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); 
      } 
     } 
    } 

Après que l'utilisateur a ouvert une session avec succès:

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

Le problème est, onResume() est appelée avant onActivityResult() donc quand l'utilisateur s'est connecté avec succès, mon activité principale n'obtient pas noti car onResume() est appelé en premier.

Quel est le meilleur endroit pour demander une connexion?

Répondre

80

L'appel à onActivityResult se produit avant onResume, en fait (voir the docs). Êtes-vous sûr de commencer réellement l'activité souhaitée avec startActivityForResult et que vous définissez le résultat de l'activité invoquée sur RESULT_OK avant de renvoyer une valeur à votre activité? Essayez simplement de mettre une instruction Log dans votre onActivityResult pour consigner cette valeur et assurez-vous qu'elle est bien atteinte. En outre, où définissez-vous la valeur de la préférence isLoggedIn? Il semble que vous devriez régler cela à true dans votre activité de connexion avant qu'il ne retourne de toute façon, mais ce n'est clairement pas le cas.

+0

Je configure isLoggedIn une fois que l'utilisateur s'est connecté. Voir mon code mis à jour. pas sûr de ce qui ne va pas? –

+0

vous avez raison, onActivityResult() est appelé avant onResume(). Vous ne savez pas pourquoi mes préférences sont mal lues alors? –

+6

ajouté un commit() après mon putBoolean. A fait le tour. –

2

Vous pouvez envisager d'extraire l'état de connexion de l'activité. Par exemple, si un utilisateur peut poster des commentaires, laissez l'action onPost effectuer un ping pour l'état de connexion et passer à partir de là, plutôt que de l'état d'activité.

21

Avec des fragments, il n'est même pas aussi simple que onActivityResult() étant appelé avant l'appel à onResume(). Si l'activité à laquelle vous revenez a été éliminée dans l'intervalle, vous constaterez que les appels à (par exemple) getActivity() de onActivityResult() renverront null. Toutefois, si l'activité n'a pas été supprimée, un appel à getActivity() renverra l'activité contenant. Cette incohérence peut être une source de défauts difficiles à diagnostiquer, mais vous pouvez vérifier le comportement de votre application en activant l'option du développeur "Ne pas conserver les activités". J'ai tendance à garder ceci activé - je préfère voir un NullPointerException en développement qu'en production.

Questions connexes