主Activity加载时检测存储中可序列化Data对象是否存在的最优方法
嘿,这个需求其实超简单,咱们只需要把「检查+读取」的逻辑封装成一个小方法,然后在onCreate()里做个简单判断就行,完全不用复杂的逻辑嵌套。
最简实现步骤
首先,先把读取保存的Data对象的逻辑封装成一个方法,当没有保存过或者读取失败时返回null:
private Data loadSavedData() { FileInputStream fis = null; ObjectInputStream ois = null; try { // 这里用内置的文件存储,你也可以换成自己的存储路径 fis = openFileInput("my_data_file"); ois = new ObjectInputStream(fis); return (Data) ois.readObject(); } catch (FileNotFoundException e) { // 文件不存在 = 从未保存过,直接返回null return null; } catch (IOException | ClassNotFoundException e) { // 读取出错或者类不匹配,也返回null(相当于用新对象) e.printStackTrace(); return null; } finally { // 别忘了关闭流 try { if (ois != null) ois.close(); if (fis != null) fis.close(); } catch (IOException e) { e.printStackTrace(); } } }
然后在onCreate()里只需要两行代码搞定核心逻辑:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 先尝试读取已保存的对象 Data myData = loadSavedData(); // 如果读取不到(返回null),就新建一个实例 if (myData == null) { myData = new Data(); } // 接下来就可以正常使用myData啦 }
额外提醒
- 确保你的
Data类确实实现了Serializable接口,比如:public class Data implements Serializable,而且类里的所有成员变量也必须是可序列化的(基本类型、String或者也实现了Serializable的类)。 - 如果你的读写逻辑是用
SharedPreferences存储字节数组的,只需要把loadSavedData()里的读取逻辑换成对应的SP读取逻辑就行,核心判断逻辑完全一样。 - 上面的写法避免了重复调用读取方法,比三元运算符的写法更高效(不用做两次IO操作),也更易读。
内容的提问来源于stack exchange,提问作者laurie
相关产品推荐
相关产品推荐

