【问题标题】:Why is my SharedPreferences not working?- The retrieved Object is null为什么我的 SharedPreferences 不起作用?- 检索到的对象为空
【发布时间】:2015-08-10 15:48:22
【问题描述】:

当应用程序转到 onStop() 时,我正在尝试保存 ColorBean 类的对象

public class MainActivity extends ExpandableListActivity {

    private ColorAdapter expListAdapter;
        LinkedHashMap<String, ArrayList<ColorBean>> colorsMap2 = new LinkedHashMap<String, ArrayList<ColorBean>>();
        SharedPreferences prefs;
        static String fileName = "SharedObject";

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            setContentView(R.layout.main);
            ArrayList<String> groupNames = new ArrayList<String>();

            prefs = getPreferences(MODE_PRIVATE);
            final LinkedHashMap<String, ArrayList<ColorBean>> colorsMap = new LinkedHashMap<String, ArrayList<ColorBean>>();

            ArrayList<ColorBean> color = new ArrayList<ColorBean>();
            //Trying to fetch the prefs
            colorsMap2 = (LinkedHashMap<String, ArrayList<ColorBean>>) loadFromSharedPrefs();

            if (colorsMap2 == null || colorsMap2.size() == 0)
                Toast.makeText(this, "Not Retrieved", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected void onResume() {
            super.onResume();
            //fetching them here too
            if (loadFromSharedPrefs() != null) {
                colorsMap2 = (LinkedHashMap<String, ArrayList<ColorBean>>) loadFromSharedPrefs();
            }
        }

        @Override
        protected void onStop() {
            super.onStop();
            //saving the preferences
            saveToSharedPrefs(colorsMap2);
        }

        public void saveToSharedPrefs(Object objToSave) {
            SharedPreferences.Editor editor = prefs.edit();
            Gson gson = new Gson();
            String json = gson.toJson(objToSave);
            editor.putString("MyObject", json);
            editor.commit();
        }

        public Object loadFromSharedPrefs() {
            Toast.makeText(this, "loading", Toast.LENGTH_SHORT).show();
            Gson gson = new Gson();
            Object obj = null;
            if (prefs != null) {
                String json = prefs.getString("MyObject", "");
                obj = gson.fromJson(json, Object.class);
            }
            return obj;
        }
    }

【问题讨论】:

  • 请完整而准确地解释这里的“不工作”是什么意思。
  • 每当我杀死并重新启动应用程序时,obj = gson.fromJson(json, Object.class);返回空值。
  • 检查首选项!= null?
  • 第一次启动应用时,可能会出现空指针异常:String json = prefs.getString("MyObject", "");
  • 我试过 Type mapType = new TypeToken>>(){}.getType();但这无济于事。

标签: java android json gson sharedpreferences


【解决方案1】:

看来你需要换行了:

obj = gson.fromJson(json, Object.class);

到:

obj = gson.fromJson(json, LinkedHashMap<String, ArrayList<ColorBean>>.class);

更新

抱歉,我使用 Gson 已经有一段时间了,是的,你是对的,我上面说的不起作用。序列化类型时需要存储泛型类型信息,所以序列化和反序列化时需要使用Gson的TypeToken类:

Type mapType = new TypeToken<LinkedHashMap<String, ArrayList<ColorBean>>>(){}.getType();

然后序列化使用:

String json = gson.toJson(objToSave, mapType);

并使用反序列化:

obj = gson.fromJson(json, mapType);

有一个教程 here 涵盖了使用 Gson 和泛型类型。

【讨论】:

  • 给出编译错误:无法从参数化类型中选择。
  • 响应 cmets 更新。
  • @HexAndBugs 那个“类型”是什么?
  • @HexAndBugs 需要为“Type”导入什么类?
  • 对不起,我试图从记忆中做,我的记忆显然不是那么好:(我已经更新了上面的代码并添加了一个教程的链接。Typejava.lang.reflect.Type
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
相关资源
最近更新 更多