2017-03-28 25 views
0

我使用的GsonPreferenceAdapter如herePrateek's RxPreferences庫。如何存儲和檢索列表<MyClass>使用RxPreferences對象

我的片段類代碼:

@Inject RxSharedPreferences sharedPreferences; 
@Inject Gson gson; 

List<MyClass> my_class_list; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    // Binding and Inject go here. 

    Class listType = new TypeToken<ArrayList<MyClass>>(){}.getClass(); 
    GsonPreferenceAdapter<List<MyClass>> adapter = new GsonPreferenceAdapter<>(gson, listType, new ArrayList<MyClass>(), GsonPreferenceAdapter.SyntaxExceptionBehavior.NULL); 
    my_class_list = sharedPreferences.getObject("pref_myclass", new ArrayList<>(), adapter).get(); 

    if(my_class_list == null) 
     Timber.i("Tis null."); 

    Timber.i("Printing MyClass items..."); 
    for(MyClass item: my_class_list) 
     Timber.i("MyClass: " + item); 

} 

@OnClick(R.id.add) 
public void add() { 

    MyClass entry = new MyClass("Count Dracula", "12345"); 
    my_class_list.add(entry); 

    Class listType = new TypeToken<List<MyClass>>(){}.getClass(); 
    GsonPreferenceAdapter<List<MyClass>> adapter = new GsonPreferenceAdapter<>(gson, listType, new ArrayList<MyClass>(), GsonPreferenceAdapter.SyntaxExceptionBehavior.NULL); 
    sharedPreferences.getObject("pref_myclass", new ArrayList<>(), adapter).set(my_class_list); 

    Timber.i("Data Saved"); 
    return false; 
} 

當我運行它的第一次,也不會記錄提斯空這意味着my_class_list不爲空。然後點擊按鈕調用add(),這將返回保存的數據,表明它確實已保存。與當我重新啓動它崩潰的應用程序在for循環:

Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference 

它還打印提斯空所以我很驚訝,怎麼加空。這裏發生了什麼,以及如何解決這個問題?

內容的MyClass:

public class MyClass { 

    @SerializedName("name") 
    @Expose 
    public String name; 

    @SerializedName("number") 
    @Expose 
    public String number; 

    public MyClass(String name, String number) { 
     this.name = name; 
     this.number = number; 
    } 

    @Override 
    public String toString() { 
     return "MyClass{" + 
       "name='" + name + '\'' + 
       ", number='" + number + '\'' + 
       '}'; 
    } 

} 

回答

0

沒關係我想通了我自己。如果有其他人遇到同一問題,我已經給出了答案。問題出在我剝去的GsonPreferenceAdapter上。我將類更改爲類型,一切正常。

Type type = new TypeToken<List<MyClass>>(){}.getType(); 
GsonPreferenceAdapter<List<MyClass>> adapter = new GsonPreferenceAdapter<>(gson, type, new ArrayList<>(), GsonPreferenceAdapter.SyntaxExceptionBehavior.NULL); 
my_class_list = sharedPreferences.getObject("pref_myclass", new ArrayList<>(), adapter).get(); 
相關問題