1

在使用应用程序对象遇到困难之后,我有了一个(新的?)想法,即使用 GSON 库和 Sharedpreferences 在活动之间交换数据。这有一个很大的优势,即如果应用程序关闭,对象不会被破坏。

我想知道你的想法

  1. 安全
  2. 性能
  3. 应用稳定性

这就是我所做的。首先创建一个 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)。

实现中唯一的 annyong 是我必须更新对象。知道如何在没有这种方法的情况下做到这一点吗?

我有任何改进建议,请随时发布。

4

2 回答 2

4

我创建了一个库,可以很容易地以与您描述的方式相同的方式保存数据: DroidPrefs

您可以很容易地保存和加载值,但您不必担心带有 TypeToken 的辅助类等等。

从这个 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);

如果对象之前没有序列化,则将使用默认构造函数创建一个新对象。

于 2013-06-20T06:48:53.477 回答
1

嗯。这是一个有趣的想法,但 SharedPreferences 并不是传输和持久化数据的最佳选择。当然,正如您所见,Application 或任何其他类型的静态变量都不是。

在不知道您要做什么的情况下,我无法提出确切的替代方案,但是在相同的情况下,我会使用由内容提供者包装的数据库。您可能认为这对于您正在尝试做的事情来说工作量太大,但是数据库是持久的、可索引的、可搜索的并且易于更新。

如果您想在活动之间传递瞬态数据,请在其扩展数据中使用带有对象的意图。如果数据不是真正瞬态的,请将其保存在某个地方。如果是少量数据,例如设置,则将其保存在 SharedPreferences 中。如果是大量线性数据,例如 JPEG 图像,请将其保存在文件中。如果是结构化数据,请将其保存在数据库中。但是,不要仅仅因为它“更容易”而试图用其中一个替换另一个。

于 2013-04-05T19:55:11.837 回答