在使用应用程序对象后,我有一个(新的?)想法,使用GSON Libary和Sharedpreferences在活动之间交换数据。这具有很大的优势,即如果应用程序关闭,对象不会被破坏。
我想知道你的想法
这是我的工作。首先创建一个MyExchanger类
public class MyExchanger {
//store your variables here
String name;
List<Vokabel> vokabeliste;
//put your GETTERS und SETTERS HERE (or make them public)
}
然后是魔术发生的辅助类
public class ExchangerUtils {
Context context;
SharedPreferences prefs;
SharedPreferences.Editor editor;
Resources res;
Gson gson;
Type type ;
public ExchangerUtils(Context context) {
this.context = context;
prefs = PreferenceManager.getDefaultSharedPreferences(context
.getApplicationContext());
res = context.getResources();
type = new TypeToken<MyExchanger>() {
}.getType();
}
public void updateExchanger(MyExchanger exchanger) {
gson = new Gson();
String exchangerjson = gson.toJson(exchanger, type);
editor = prefs.edit();
editor.putString(res.getString(R.string.key_exchanger), exchangerjson);
editor.commit();
}
public Exchanger getExchanger(){
String exchangerjson = prefs.getString(res.getString(R.string.key_exchanger), null);
Gson gson = new Gson();
if(exchangerjson!=null){
My Exchanger exchanger = gson.fromJson(exchangerjson, type);
return exchanger;
}
return new MyExchanger();
}
}
实施可能看起来有点喜欢这个
//Somewhere in the activity
ExchangerUtils utils = new ExchangerUtils(this);
MyExchanger exchanger = utils.getExchanger();
exchanger.setName("a name");
utils.update(exchanger);
我已经在我的两个应用中测试了它,它运行得很好,也可以使用旧手机和大量对象(> 100)。
实现中唯一的东西是我必须更新对象。如果没有这种方法,怎么办?
我有任何改进建议,请随时发布。
答案 0 :(得分:4)
我创建了一个能够以您描述的方式轻松保存数据的库: DroidPrefs
您可以非常轻松地保存和加载值,但您不必担心使用TypeTokens的助手类以及所有这些。
从这个POJO
public class Animal
{
private String mName;
private String mBreed;
private int mLegs;
public Animal() {
mName = "";
mBreed = "";
mLegs = 0;
}
public Animal(String name, String breed, int legs)
{
mName = name;
mBreed = breed;
mLegs = legs;
}
}
保存对象
Animal newAnimal = new Animal("Gitty", "Octocat", 8);
DroidPrefs.instance(context).put("animal", newAnimal).apply();
加载对象
Animal newAnimal = DroidPrefs.instance(context).get("animal", Animal.class);
如果该对象先前未被序列化,则将使用默认构造函数创建一个新对象。
答案 1 :(得分:1)
嗯。这是一个有趣的想法,但SharedPreferences并不是传输和保存数据的最佳选择。当然,正如您所见,Application或任何其他类型的静态变量都没有。
我不能在不知道你想要做什么的情况下提出一个确切的选择,但在相同的情况下,我会使用由内容提供商包装的数据库。您可能会认为这对于您尝试做的事情来说太多了,但数据库是持久的,可索引的,可搜索的,并且易于更新。
如果要在活动之间传递瞬态数据,请在扩展数据中使用Intents和对象。如果数据不是真正短暂的,那就坚持下去吧。如果是少量数据(例如设置),则将其保留在SharedPreferences中。如果是大量的线性数据(例如JPEG图像),则将其保存在文件中。如果是结构化数据,请将其保留在数据库中。但是,不要试图将其中一个替换为另一个,因为它“更容易”。