2017-01-18 4 views
0

sharedPreferenceを使用してオブジェクトを保存しても問題はありませんが、このgetQbUser()メソッドを共有する以前のアクティビティを実行しようとするとクラッシュします私は、アプリケーションを終了し、私のアプリケーションを再実行し、それが正常に動作するまで、プリファレンスは、ループ内でクラッシュを開始するオブジェクトを見つけることができませんでした。共有優先設定はオブジェクトを持っています。クラッシュ後にアプリが再実行されたときの共有設定のヌル値を示します

public void saveQbuser(QBUser user){ 
    SharedPreferences.Editor prefsEditor = mPref.edit(); 
    Gson gson = new Gson(); 
    String json = gson.toJson(user); 
    prefsEditor.putString("qbuser", json); 
    prefsEditor.commit(); 
} 

public QBUser getQbUser(){ 
    Gson gson = new Gson(); 
    String json = mPref.getString("qbuser",""); 
    QBUser obj = gson.fromJson(json, QBUser.class); 
    return obj; 

} 

//ログ

Caused by java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.String android.content.SharedPreferences.getString(java.lang.String, java.lang.String)' on a null object reference 
    com.attribes.push2beat.Utils.DevicePreferences.getQbUser (DevicePreferences.java:86) 
    com.attribes.push2beat.mainnavigation.SelectActivity.createChatService (SelectActivity.java:38) 
    com.attribes.push2beat.mainnavigation.SelectActivity.onCreate (SelectActivity.java:27) 
    android.app.Activity.performCreate (Activity.java:6251) 
    android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1107) 
    android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2369) 
    android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2476) 
    android.app.ActivityThread.-wrap11 (ActivityThread.java) 
    android.app.ActivityThread$H.handleMessage (ActivityThread.java:1344) 
    android.os.Handler.dispatchMessage (Handler.java:102) 
    android.os.Looper.loop (Looper.java:148) 
    android.app.ActivityThread.main (ActivityThread.java:5417) 
    java.lang.reflect.Method.invoke (Method.java) 
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:726) 
    com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616) 

**注:問題は、アプリがクラッシュ状態である場合にのみ発生し、それ自体で、前のアクティビティを実行しようとしているそうでなければ、私の好みのクラスには問題がありません* *

+0

ここで、「mPref」オブジェクトを初期化しましたか?完全なコードを投稿してください.. –

+0

Uは 'SharedPreferences mPref;'を初期化しましたか? – W4R10CK

+0

あなたのsharedPref変数が、アプリケーションクラッシュ後にnullになる場合は –

答えて

0

あなたは私があなたのQBUserクラスは、次のようにすべきだと思いますあなたのQBUser.class

を表示してくださいすることができます。

public class QBUser { 

@SerializedName("name") 
String name; 

@SerializedName("address") 
String address; 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getAddress() { 
    return address; 
} 

public void setAddress(String address) { 
    this.address = address; 
} 

あなたは あなたのコードは、あなたがこのエラーを取得Thatsなぜオブジェクトを文字列に変換することができないオブジェクトを文字列に変換するためのSerialzedName Annonationを追加する必要があります。

このことを知らない他の人々のために、心に留めてください。

+0

これはコメントではない答えがあります –

+0

あなたの提案をありがとうがコメントすることができません。 –

+0

それは50の評判を必要としています、この問題ではない質問に集中してください –

0

次のコードに従うことができます。

文字列PREFS_NAME = "QBUser";あなたはこのコードを使用することができます

public void saveQbuser(Context context,QBUser user) { 
    Editor editor = context.getSharedPreferences(PREFS_NAME, 
      Context.MODE_PRIVATE).edit(); 
    Gson gson = new Gson(); 
     String json = gson.toJson(user); 
     prefsEditor.putString("qbuser", json); 
     prefsEditor.commit(); 

} 
public QBUser getQbUser() 
{ 

SharedPreferences preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); 
     Gson gson = new Gson(); 
String json = preferences.getString("qbuser",""); 
QBUser obj = gson.fromJson(json, QBUser.class); 
return obj; 

} 

たりQBUser.class

public class QBUser 
    { 
    // do here code setter or getter method of jsonString or objects. 
     } 
+0

プリファレンスがアプリケーション全体でうまく動作し、オブジェクトを保存して問題なく検索するフルクラスを投稿しませんでしたが、アプリケーションがクラッシュした私のアンドロイドデバイスは以前のアクティビティを自動的に実行し、その時間には値が見つかりませんでした。しかし、あなたがアプリケーションを閉じて、そのアクティビティを再度実行した場合は、そのオブジェクトがあります –

0

class PrefsHelper{ 


    private SharedPreference mPref; 
    private Editor edit; 
    private static final PREFS_NAME = "myprefs"; 


    public PrefsHelper(Context context){ 
    mPref = context.getSharedPreferences(PREFS_NAME, 
       Context.MODE_PRIVATE); 
    edit = mPref.edit(); 
    } 

    public void saveQbuser(QBUser user) 
     { 

      Gson gson = new Gson(); 
      String json = gson.toJson(user); 
      edit.putString("qbuser", json); 
      edit.commit(); 

    } 


public QBUser getQbUser() 
{ 
    Gson gson = new Gson(); 
    String json = mPref.getString("qbuser",""); 
    QBUser obj = gson.fromJson(json, QBUser.class); 
    return obj; 

} 
    } 
+0

プリファレンスクラスがアプリケーション全体で正常に動作していて、オブジェクトを保存して問題なく検索できますが、デバイスは以前のアクティビティを自動的に実行し、その時間には値が見つかりませんでした。しかし、あなたがアプリケーションを閉じて、そのアクティビティを再度実行した場合は、そのオブジェクトがあります。 –

+0

アプリがクラッシュしたときにあなたのアプリが返すアクティビティのコードを表示できますか? –

+0

私はあなたが呼び出されていないonCreate()のようなsuperメソッドでオブジェクトを表示していなければならないので、アプリケーションがクラッシュしたときに以前のアクティビティに価値がないと思います。あなたのアプリケーションがクラッシュすると、以前のアクティビティは、決して破棄されなかったので、onResume()を呼び出します。 –

関連する問題