web-dev-qa-db-fra.com

OnResume () est-il appelé avant onActivityResult ()?

Voici comment mon application est présentée:

  1. l'utilisateur onResume () est invité à se connecter
  2. Si l'utilisateur se connecte, il peut continuer à utiliser l'application . Si l'utilisateur se déconnecte à tout moment, je souhaite à nouveau me connecter

Comment puis-je atteindre cet objectif?

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

Une fois l'utilisateur connecté 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 que onResume () est appelé avant onActivityResult (), donc lorsque l'utilisateur s'est connecté avec succès, mon activité principale n'est pas notifiée car onResume () est appelé en premier.

Quel est le meilleur endroit pour demander la connexion?

74
Sheehan Alam

L'appel à onActivityResult se produit avant onResume, en fait (voir la documentation ). Êtes-vous sûr que vous démarrez réellement l'activité que vous vouliez avec startActivityForResult et que vous définissez le résultat de l'activité invoquée sur RESULT_OK avant de rendre une valeur à votre activité? Essayez simplement de mettre une instruction Log dans votre onActivityResult pour enregistrer cette valeur et vous assurer qu'elle est atteinte. De plus, où définissez-vous la valeur de la préférence isLoggedIn? Il semble que vous devriez définir cela sur true dans votre activité de connexion avant qu'il ne revienne de toute façon, mais cela ne se produit clairement pas.

91
Yoni Samlan

Avec des fragments, ce n'est même pas aussi simple que d'appeler onActivityResult() avant l'appel à onResume(). Si l'activité à laquelle vous revenez a été supprimée dans l'intervalle, vous constaterez que les appels à (par exemple) getActivity() de onActivityResult() renverront null. Cependant, si l'activité n'a pas été supprimée, un appel à getActivity() renverra l'activité conteneur.

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 développeur "Ne pas conserver les activités". J'ai tendance à garder cela activé - je préfère voir un NullPointerException en développement qu'en production.

28
Phil

Vous pouvez envisager d'abstraire l'état de connexion de l'activité. Par exemple, si un utilisateur peut publier des commentaires, laissez l'action onPost exécuter un ping pour l'état de connexion et partir de là, au lieu de l'état d'activité.

2
sgarman