2016-06-14 3 views
1

Мне нужно и объект, содержащий мои настройки в примитивных типах, чтобы иметь возможность загружать и сохранять из общих настроек Android и вызывать метод загрузки или сохранения объекта.Объект Android Сериализовывается из метода

Я создал класс под названием thePreferences.java, этот класс имеет несколько примитивных полей. Я создал в этом классе 2х методов для загрузки и сохранения этого класса из и в sharedPreferences. См ниже код, используемый в моем классе:

import android.content.Context; 
import android.content.SharedPreferences; 

import com.google.gson.Gson; 
import com.google.gson.JsonSerializer; 

import android.content.SharedPreferences; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 

import java.io.Serializable; 

public class thePreferences extends AppCompatActivity implements Serializable { 

    private static final String PREFS_NAME = "thePreferences"; 
    private static final String PREF_TEXT = "pref_text"; 
    public static final String TAG = "WPC"; 

    public boolean loggedIn = false; 
    public int deviceId = 0; 
    public int userId = 0; 
    public String email = ""; 
    public String deviceAlias = ""; 

    public thePreferences() { 
    } 

    public thePreferences(boolean loggedIn, int deviceId, int userId, String email, String deviceAlias) { 
     this.loggedIn = loggedIn; 
     this.deviceId = deviceId; 
     this.userId = userId; 
     this.email = email; 
     this.deviceAlias = deviceAlias; 
    } 


    public boolean loadThePreferences(Context c) { 

     SharedPreferences pref = c.getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 
     if (pref.contains(PREF_TEXT)) { 
      String theJson = pref.getString(PREF_TEXT, null); 
      Log.i(TAG, "The JSON string loaded from Shared Preferences : " + theJson); 
      thePreferences p = new Gson().fromJson(theJson, thePreferences.class); 
      this.deviceAlias = (p.deviceAlias); 
      this.deviceId = (p.deviceId); 
      this.email = (p.email); 
      this.loggedIn = (p.loggedIn); 
      return true; 

     } else { 
      Log.i(TAG, "Could not load SharedPreferences, value does not exist."); 
      return false; 
     } 

    } 

    public static boolean saveThePreferences(Context c,thePreferences p){ 

     Gson gson = new Gson(); 

     String theJson = gson.toJson(p); 
     c.getSharedPreferences(PREFS_NAME,MODE_PRIVATE) 
       .edit() 
       .putString(PREF_TEXT,theJson) 
       .commit(); 

     return true; 
    } 




    @Override 
    public String toString() { 
     return "thePreferences{" + 
       "loggedIn=" + this.loggedIn + 
       ", deviceId=" + this.deviceId + 
       ", userId=" + this.userId + 
       ", email='" + this.email + '\'' + 
       ", deviceAlias='" + this.deviceAlias + '\'' + 
       '}'; 
    } 


} 

Затем я пытаюсь вызвать это от другой деятельности, чтобы загрузить и сохранить свои предпочтения следующим образом:

contextOfApplication = getApplicationContext(); 
thePreferences preferencesObj = new thePreferences(true,12345,552441,"[email protected]","theDeivceAlias"); 
preferencesObj.saveThePreferences(contextOfApplication,preferencesObj); 

preferencesObj.loadThePreferences(contextOfApplication); 

Я не могу заставить его выполнить мимо saveThePreferences(). Он держится на crashin с помощью StackOverflow, и я не могу понять, почему.

Может кто-нибудь, пожалуйста, сообщите, есть ли другой способ сделать это или, может быть, где я поступил неправильно?

Спасибо заранее

+0

На первом, thePreferences класс поэтому по соглашению должны начните с заглавной буквы. Затем вы не должны пытаться сериализовать целую деятельность. Вместо этого попробуйте сохранить ваши данные, которые вам нужны в качестве примитивных типов, а также получите их как типы примитивов. Чтобы сохранить весь ваш класс как строку json, здесь нет смысла. – JacksOnF1re

+0

Спасибо, я не хочу сериализовать всю активность, но только экземпляр объекта моего класса, который содержит только примитивные поля. Основываясь на документации GSON здесь: https://sites.google.com/site/gson/gson-user-guide#TOC-Object-Examples – Solx85

ответ

2

Передача prefernecesObj в себя

preferencesObj.saveThePreferences(contextOfApplication,preferencesObj); 

Измените функцию:

public boolean saveThePreferences(Context c){ 

    Gson gson = new Gson(); 

    String theJson = gson.toJson(this); 
    c.getSharedPreferences(PREFS_NAME,MODE_PRIVATE) 
      .edit() 
      .putString(PREF_TEXT,theJson) 
      .commit(); 

    return true; 
} 

затем называют так:

preferencesObj.saveThePreferences(contextOfApplication); 
3

На первом, thePreferences класс поэтому по соглашению должно начинаться с заглавной буквы.

Далее вы не должны пытаться сериализовать всю деятельность. Вместо этого попробуйте сохранить ваши данные, которые вам нужны в качестве примитивных типов, а также получите их как типы примитивов. Чтобы сохранить весь ваш класс как строку json, здесь нет смысла.

Один из способов сделать:

  1. Создайте новый класс, который только цель состоит, чтобы загрузить и сохранить необходимые данные. (Как и ваши thePreferences, но сделайте его простым классом без наследования активности).

  2. Новый класс содержит имя и ключи предпочтения как статические строки.

  3. Инстанцировать новый класс с контекстом и поджать общие предпочтения в качестве конечного элемента

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

  5. Используйте этот класс в вашей деятельности, как член или метод локальной переменной

Ps .: Удалить gson и сериализуемая материал

Редактирование: если вы действительно хотите хранить свои данные как строку json, то sharedPreferences не используются. Я не могу рекомендовать это сделать, но тогда вы должны отправить свои данные на сервер или сохранить их на внешнем хранилище данных (SD-карта и т. Д.).