Android 使用 JSON 保存应用数据

来源:互联网 发布:hbase数据库设计原则 编辑:程序博客网 时间:2024/06/06 03:56
如题。假设有一个 Task 类保存了用户的任务(内容、日期、是否解决),ListView 负责列出Task列表。应用退出后,使用 JSON 格式保存用户的Task列表,应用启动后恢复出来。JSON 数据保存在应用的私有存储区。比如开头是这样的:

public class TaskListFragment extends ListFragment {
    private ArrayList<Task> mTasks;

我们在onCreate中设置 mTasks = loadTasks(); 在onPause中 saveTasks();

于是就有这些代码:

private Task toTask(JSONObject j) throws JSONException{    return new Task(j.getString("Context"),j.getLong("Date"),j.getBoolean("Solve"));}private JSONObject toJSON(Task t) throws JSONException{    JSONObject j = new JSONObject();    j.put("Context",t.getContext());    j.put("Date",t.getDate());    j.put("Solve",t.isSolved());    return j;}private void saveTasks(){    Writer w = null;    try{        OutputStream out = getActivity().openFileOutput("tasks.json", Context.MODE_PRIVATE);        w = new OutputStreamWriter(out);        JSONArray ja = new JSONArray();        for (Task t : mTasks){            ja.put(toJSON(t));        }        w.write(ja.toString());    }    catch(Exception e){}    finally {        if(w!=null) try{w.close();}catch(Exception e){}    }}private ArrayList<Task> loadTasks(){    ArrayList<Task> tasks = new ArrayList<>();    BufferedReader r = null;    try {        r = new BufferedReader(new InputStreamReader(getActivity().openFileInput("tasks.json")));        StringBuilder sb = new StringBuilder();        String line = r.readLine();        while(line !=null){            sb.append(line);            line = r.readLine();        }        JSONArray ja = (JSONArray)new JSONTokener(sb.toString()).nextValue();        for(int i=0;i<ja.length();i++)            tasks.add(toTask(ja.getJSONObject(i)));    }    catch (FileNotFoundException e) {        return tasks;    }    catch(Exception e){}    finally {        if (r != null) try{r.close();}catch(Exception e){}    }    return tasks;}

我最无法忍受的就是 close 方法会抛出异常,finally 中我还要再嵌套一个try-catch。 无语。


1 0
原创粉丝点击