Android 关于SP读取与存储正确打开方式?
2017-06-07 16:56
459 查看
一.存储方式分类:SharedPreferences存储
二.SharedPreferences存储
1.特点
①存储单一数据,例如数值,字符串,布尔
②文件:/date/date/包名/shared_prefs/xxx.xml: value
③以键值对的形式存储
④可以设置不被其他应用操作
2.API
(1)SharedPreferences
①获取实例context.getSharedPreferences():
1)name 存储文件名; 2)mode 操作模式:MODE_PRIVATE不能被别的应用访问,覆盖模式;MODE_APPEND不能被别的应用访问,追加模式;
②启动编辑器:edit():返回Editor
③读取Value:1)getString(key,defValue 缺省值) 2)getAll( ) 返回所有键值对的 Map集合
(2)Editor
①存放数据:1)putString(key,value) 2)putLong(key,value) 3)putInt 4)putFloat 5)putBoolean 6)putStringSet
②提交存储
③clear() 清除
④remove(String key) 移除指令key的键值对
下面请允许我盗一张图
听起来好像思路有点清晰,下面开始我的表演Action
因为我这边提交的都是json格式的数据下面是点击到登录按钮提交的json数据这时候服务器给我返回sid
登录抓包信息如下Fiddler
请求的接口地址因为这里提交的是json数据所以这里添加一个请求头信息,如果你自己觉得太死板,请自定义拦截器,这个没有问题,根据自己的需求来。
服务端响应的bean跟上面的LoginResponse一致同样是GsonFormat生成
然后点击退出按钮 代码很乱后期整理
我去,什么鬼,缺少参数,什么参数,为什么会这样,不就是一个sessionid吗?好吧我承认我菜,那断点试试,工欲善其事,必先利其器,那就debug走起不好意思debug今天出了点问题,哈哈!
其实就是自己不小心把那句代码注释掉了手贱!
因为之前的sessionId初始化就是null你怎么可能拿得到吗?后面的读取时没有问题的!狠狠的给自己一巴掌!
下面直接看最后的表演图
2、出现问题学会debug慢慢调试 看程序的走势进一步找出问题所在
3、必要的时候使用抓包神器Fildder那么问题迎刃而解
二.SharedPreferences存储
1.特点
①存储单一数据,例如数值,字符串,布尔
②文件:/date/date/包名/shared_prefs/xxx.xml: value
③以键值对的形式存储
④可以设置不被其他应用操作
2.API
(1)SharedPreferences
①获取实例context.getSharedPreferences():
1)name 存储文件名; 2)mode 操作模式:MODE_PRIVATE不能被别的应用访问,覆盖模式;MODE_APPEND不能被别的应用访问,追加模式;
②启动编辑器:edit():返回Editor
③读取Value:1)getString(key,defValue 缺省值) 2)getAll( ) 返回所有键值对的 Map集合
(2)Editor
①存放数据:1)putString(key,value) 2)putLong(key,value) 3)putInt 4)putFloat 5)putBoolean 6)putStringSet
②提交存储
③clear() 清除
④remove(String key) 移除指令key的键值对
下面请允许我盗一张图
下面开始我的表演
看样子中午还是要休息一下,打疲劳战队身体没好处,而且写的代码质量也不高!场景一
首先我要实现的功能就是简单的注销用户,当然方法有很多,你可以通过EventBus或者RXBus注册订阅者然后发布一个事件出去,另外一种就是通过后台移除session,清除当前的sesssionid 因为相信大家都知道,客户端只有一个Cookie,Cookie对应服务端Session的key,首先登录的时候服务端返回一个sessionid给我然后我通过sp把拿到的SessionId保存起来,然后在点击退出当前用户的时候把之前登录的SessionId提交过去与服务端那边对比,如果对比一致说明我已经登录过了,然后这时候服务端移除session,返回给我,提示成功退出!听起来好像思路有点清晰,下面开始我的表演Action
因为我这边提交的都是json格式的数据下面是点击到登录按钮提交的json数据这时候服务器给我返回sid
Gson gson = new Gson(); final HashMap<String, String> params = new HashMap<>(); params.put("username", "18388483434"); params.put("pass", "123456"); final String strEntity = gson.toJson(params); RequestBody body = RequestBody.create(MediaType.parse("application/json;charset=UTF-8"), strEntity); AccountService account = RetrofitApiManager.getInstance().getService(AccountService.class); Call<LoginResponse> call = account.login(body); final String sessionId=null; call.enqueue(new Callback<LoginResponse>() { @Override public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { if (response.isSuccessful()) { if (sp == null) { sp = getSharedPreferences("exitsid",MODE_PRIVATE); } SharedPreferences.Editor editor = sp.edit(); //sessionid editor.putString("sid", sessionId); //异步提交 Toast.makeText(LoginActivity.this, response.body().getMessage(), Toast.LENGTH_SHORT).show(); // Log.i(TAG, "onResponse: " + response.body().getCode() + response.body().getMessage()); startActivity(new Intent(LoginActivity.this, MainActivity.class)); editor.apply(); } } @Override public void onFailure(Call<LoginResponse> call, Throwable t) { Log.e(TAG, "onFailure: " + t.getMessage()); } });
登录抓包信息如下Fiddler
请求的接口地址因为这里提交的是json数据所以这里添加一个请求头信息,如果你自己觉得太死板,请自定义拦截器,这个没有问题,根据自己的需求来。
@Headers("Content-type:application/json;charset=UTF-8") @POST("xxx/login") Call<LoginResponse> login(@Body RequestBody body);
下面是我的响应bean我这里直接GsonFormat生成
package com.visoport.medicine.http.api.response; /** * 登录服务器返回LoginResponse */ public class LoginResponse { private int code; private DataBean data; private String message; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public DataBean getData() { return data; } public void setData(DataBean data) { this.data = data; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public static class DataBean { private String sid; public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } } }
下面是注销用户
请求接口loginout//退出当前用户 @Headers("Content-type:application/json;charset=UTF-8") @POST("xxx/login/logout") Call<ExitUserResponse> logout(@Body RequestBody body);
服务端响应的bean跟上面的LoginResponse一致同样是GsonFormat生成
/** * 退出登录 */ public class ExitUserResponse { /** * code : 1200 * data : {"sid":"67b4edd5346c447afe7b9cd0ef"} * message : 成功退出 */ private int code; private DataBean data; private String message; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public DataBean getData() { return data; } public void setData(DataBean data) { this.data = data; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public static class DataBean { private String sid; public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } } }
然后点击退出按钮 代码很乱后期整理
final String sessionId; if (sp == null) { sp = getSharedPreferences("exitsid",MODE_PRIVATE); } //后面是默认值defaultvalue sessionId = sp.getString("sid", ""); Gson gson = new Gson(); final HashMap<String, String> params = new HashMap<>(); params.put("sid", sessionId); Log.i(TAG, "onClick: "+sessionId); String strEntity = gson.toJson(params); RequestBody body = RequestBody.create(MediaType.parse("application/json;charset=UTF-8"), strEntity); AccountService account = RetrofitApiManager.getInstance().getService(AccountService.class); Call<ExitUserResponse> call = account.logout(body); call.enqueue(new Callback<ExitUserResponse>() { @Override public void onResponse(Call<ExitUserResponse> call, Response<ExitUserResponse> response) { if(response.isSuccessful()) { Toast.makeText(SettingActivity.this,response.body().getMessage(),Toast.LENGTH_SHORT).show(); startActivity(new Intent(SettingActivity.this,LoginActivity.class)); } } @Override public void onFailure(Call<ExitUserResponse> call, Throwable t) { Toast.makeText(SettingActivity.this,t.getMessage(),Toast.LENGTH_SHORT).show(); } });
我去,什么鬼,缺少参数,什么参数,为什么会这样,不就是一个sessionid吗?好吧我承认我菜,那断点试试,工欲善其事,必先利其器,那就debug走起不好意思debug今天出了点问题,哈哈!
其实就是自己不小心把那句代码注释掉了手贱!
String sessionId = response.body().getData().getSid();
因为之前的sessionId初始化就是null你怎么可能拿得到吗?后面的读取时没有问题的!狠狠的给自己一巴掌!
final String sessionId=null;
下面直接看最后的表演图
总结:
1、 还是基本功好扎实,首先了解sp简单用法包括存储 写入文件 以及读取文件等2、出现问题学会debug慢慢调试 看程序的走势进一步找出问题所在
3、必要的时候使用抓包神器Fildder那么问题迎刃而解
相关文章推荐
- Android 读取文件的正确打开方式
- 关于Android开发数据存储的方式(一)
- android学习记录3(数据存储的方式:sqlite、sp、存文件。listview简单使用)
- 关于Android数据存储方式(一)——SharedPreferences
- 关于Android开发数据存储的方式(一)
- Android Dialog与软键盘的正确打开方式
- android handler 里面引用context有耗时操作是的正确打开方式
- 关于android无法读取图片正确分辨率的原因
- Android启动页面的正确打开方式
- Android 关于数据存储的小案例——SharedPreferences存储方式
- 关于Android数据存储方式(二)——SQLite
- Android中关于数据存储的方式--文件存储
- 关于我,关于本blog,关于本blog的正确打开方式
- Android——Exception异常的正确打开方式
- Android底部弹窗的正确打开方式
- Android中,关于service的启动两种方式描述不正确的是
- 自学 Android的“正确打开方式”【全面详细】
- Android签名文件的正确打开方式
- 关于Android错误的打开方式,续集。
- Android Dialog与软键盘的正确打开方式