Вызывается ли onResume () перед onActivityResult ()? - PullRequest
74 голосов
/ 23 ноября 2010

Вот как выглядит мое приложение:

  1. onResume () пользователю предлагается войти в систему
  2. Если пользователь входит в систему, он может продолжать использовать приложение 3. Если пользователь выходит из системы в любое время, я хочу снова запросить логин

Как мне этого добиться?

Вот мой MainActivity:

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

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

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

Вот мой логинДеятельность:

@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);
            }
        }
    }

После того, как пользователь успешно вошел в систему:

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

Проблема в том, что onResume () вызывается перед onActivityResult (), поэтому, когда пользователь успешно вошел в систему, мое основное действие не получает уведомление, потому что onResume () вызывается первым.

Где лучше всего запросить логин?

Ответы [ 3 ]

90 голосов
/ 23 ноября 2010

На самом деле вызов onActivityResult происходит перед onResume (см. документы ).Вы уверены, что фактически запускаете требуемое действие с startActivityForResult и что вы устанавливаете результат вызванного действия на RESULT_OK перед возвратом значения в свое действие?Попробуйте просто вставить оператор Log в onActivityResult, чтобы записать это значение и убедиться, что оно попадет.Кроме того, где вы устанавливаете значение предпочтения isLoggedIn?Похоже, вы должны установить это значение на true в своей активности входа в систему, прежде чем она все равно вернется, но этого явно не происходит.

28 голосов
/ 28 апреля 2013

С фрагментами даже не так просто, как onActivityResult() вызывается до вызова onResume(). Если действие, к которому вы возвращаетесь, было удалено за это время, вы обнаружите, что вызовы (например) getActivity() из onActivityResult() вернут ноль. Однако, если действие не было удалено, вызов getActivity() вернет содержащее действие.

Это несоответствие может быть источником трудно диагностируемых дефектов, но вы можете проверить поведение вашего приложения, включив опцию разработчика "Не выполнять действия". Я склонен держать это включенным - я бы предпочел видеть NullPointerException в разработке, а не в производстве.

2 голосов
/ 23 ноября 2010

Вы можете рассмотреть возможность абстрагирования состояния входа в систему от действия.Например, если пользователь может оставлять комментарии, позвольте действию onPost пропинговать состояние входа в систему и переходить оттуда, а не из состояния активности.

...