68

は私のアプリがレイアウトされている方法です。onActivityResult()の前にonResume()が呼び出されていますか?ここ

  1. onResume()ユーザーは、ユーザーがログインしている場合、ユーザが任意の時にログアウトした場合、彼はアプリ 3を継続して使用することができます
  2. ログインするように要求されます時間、私は再びログインを促したい

どうすればいいですか?ここで

は私MainActivityである:ここでは

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

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

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

は私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); 
      } 
     } 
    } 

ユーザーが正常にログインした後:問題は、onResume(ある

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

) onActivityResult()の前に呼び出されるので、ユーザーが正常にログインすると、私の主なアクティビティはnotiになりませんonResume()が最初に呼び出されるために失敗しました。

ログインを促す場所はどこですか?

答えて

80

onActivityResultの呼び出しは、実際にはonResumeの前で行われます(the docs参照)。実際にあなたが望むアクティビティをstartActivityForResultで開始し、アクティビティに値を返す前に呼び出されたアクティビティの結果をRESULT_OKに設定していますか?あなたのonActivityResultLogステートメントを入れて、その値を記録してヒットするようにしてください。また、isLoggedIn環境設定の値はどこで設定していますか?とにかく戻ってくる前にログインアクティビティでtrueに設定する必要があるようですが、それは明らかに起こっていません。

+0

私はユーザーがログインした後にisLoggedInを設定しています。私の更新されたコードを見てください。何が間違っているかわからない? –

+0

あなたは正しいです、onActivityResult()はonResume()の前に呼び出されています。なぜ私のprefsが間違って読まれているのか分かりませんか? –

+6

は、putBooleanの後にcommit()を追加しました。トリックをしました。 –

2

アクティビティからログイン状態を抽象化することを検討してください。たとえば、ユーザーがコメントを投稿できる場合は、onPostアクションをログイン状態にpingしてから、アクティビティ状態ではなくそこから移動します。

21

フラグメントの場合、onResume()の呼び出しの前には、onActivityResult()が呼び出されるだけでは簡単ではありません。戻り値のアクティビティが途中で処理された場合、getActivity()への呼び出しがonActivityResult()からnullを返すことがわかります。ただし、アクティビティが廃棄されていない場合は、getActivity()を呼び出すと、そのアクティビティが返されます。

この不整合は、診断するのが難しい原因となる可能性がありますが、開発者のオプション「活動をしないでください」を有効にすることで、アプリケーションの動作を確認できます。私はこれをオンにしておく傾向があります - 私はむしろ、生産よりも開発中のNullPointerExceptionを見るでしょう。

関連する問題