2016-10-25 4 views
1

私はAndroid開発の初心者です。私はユーザーのログインデータを保存して、一時停止してからアプリを再開したり、アプリを再利用したりした後にログインする必要がないようにしたかったのです。 stackoverflowのいくつかのポストを通過した後、私はonSavedInstanceがそれを行う方法であることに気づいた。onViewStateRestoredクラッシュアンドロイドアプリ

1つのloginActivityでメソッドを実装しましたが、エミュレータでこのアクティビティを開くとエラーが発生します。仮想メソッド「ブールのandroid.osを起動しようとしています。 エラーが残念ながら、「PROJECT_NAME」は

だから、私は、ログファイルをチェックして、この

のjava.lang.NullPointerExceptionを持って停止しているです。ライン上のヌル・オブジェクト参照

にBundle.getBoolean(java.lang.Stringで)」

ブールinSession = savedInstanceState.getBoolean( "LOGGEDIN")。

のonViewStateRestoredメソッド。

誰かが私が間違っていることを知る手伝いをすることができますか?ログインの詳細を保存して、アプリが一時停止または停止モードになるたびにログインする必要はありません。

ご協力ありがとうございます。 :)

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    if(inSession){ 
     savedInstanceState.putBoolean("loggedin",true); 
     savedInstanceState.putString("email",emailcol); 
     savedInstanceState.putString("password",passwordcol); 
     savedInstanceState.putString("type","login"); 
    } 
    else{ 
     savedInstanceState.putBoolean("loggedin",false); 

    } 
} 

@Override 
public void onViewStateRestored(Bundle savedInstanceState) { 
    super.onViewStateRestored(savedInstanceState); 

     boolean inSession = savedInstanceState.getBoolean("loggedin"); 
     if (inSession) { 
      String email = savedInstanceState.getString("email"); 
      String pass = savedInstanceState.getString("password"); 
      String type = "login"; 
      BackgroundWorker bw = new BackgroundWorker(this.getContext()); 
      //(Name,password,email,contact,address,type 
      bw.execute(null, pass, email, null, null, type); 
     } 

} 
+0

を保存するためにShared Preferencesを使用する必要があります。 –

答えて

1

システムがあなたの活動を渡すように束ねます。 onCreate()およびonRestoreInstanceState()コールバックメソッドは、インスタンス状態情報を含む同じBundleを受け取ります。

システムがアクティビティの新しいインスタンスを作成しているか、前のアクティビティを再作成しているかにかかわらず、onCreate()メソッドが呼び出されるため、読み込む前に状態バンドルがnullかどうかを確認する必要があります。それがヌルの場合、破壊された以前のものを復元するのではなく、アクティビティーの新しいインスタンスが作成されます。メソッドの末尾に `;

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); // Always call the superclass first 

// Check whether we're recreating a previously destroyed instance 
if (savedInstanceState != null) { 
    // Restore value of members from saved state 
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
} else { 
    // Probably initialize members with default values for a new instance 
} 
... 

}

おそらく声明` super.onSaveInstanceState(savedInstanceState)を移動してみてくださいユーザーのログイン情報

+0

恐ろしいです!どうもありがとう! :) –

+0

あなたは大歓迎です.. upvote:P –

1

getBooleanがあなたのonCreate機能で

if (savedInstanceState!= null) { //check its not null 

boolean inSession = savedInstanceState.getBoolean("loggedin"); 
    if (inSession) { 
     String email = savedInstanceState.getString("email"); 
     String pass = savedInstanceState.getString("password"); 
     String type = "login"; 
     BackgroundWorker bw = new BackgroundWorker(this.getContext()); 
     //(Name,password,email,contact,address,type 
     bw.execute(null, pass, email, null, null, type); 
    } 


} 
+0

大丈夫です。私はこれを試した、はい、savedInstanceStateはnullです。 –

+0

したがって、エラーはなくなりました。どうもありがとう。 –

+0

しかし、ユーザーが今すぐログインした後、一時停止して戻ってきたら、彼はログアウトしています –

0

そのヌルかどうかをチェックする前に、このバンドルは、プログラムに戻って渡されます。アプリケーションが再読み込み、または最初に起動されているかどうかを確認するための最良の方法は次のとおりです。

あなたの活動は、それが以前に破壊された後、あなたからあなたの保存された状態を回復することができます再作成されるアンドロイド documentationによると
if (savedInstanceState != null) { 
// Then the application is being reloaded 
}