后台任务序列化与IntentService
2016-05-11 15:14
316 查看
应用场景:当用户注册成功后,填写用户信息界面,断网了,此时点击了修改信息,出于友好考虑,应该将提交的数据,序列化保存到本地,然后允许用户继续访问app。等到下次联网时,将修改的数据自动提交到服务器
1.将请求加入到后台任务
请求——封装为javabean——序列化文件
①封装为网络请求
NetTask request = new NetTask();request.setUrl(url);request.setMethod(0);request.setHeaders(headers);request.setParameters(parameters);
②序列化
2.页面跳转
。。。。跳转到自己的需求界面
3.当网络连接时,反序列化
①注册一个监听网络变化
}}
1.将请求加入到后台任务
请求——封装为javabean——序列化文件
①封装为网络请求
public class NetTask implements Serializable { /** * */ private static final long serialVersionUID = 1L; private String url; private int method;// 0:post 1: get private Map<String, String> headers = new HashMap<String, String>(); private Map<String, String> parameters = new HashMap<String, String>(); public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public int getMethod() { return method; } public void setMethod(int method) { this.method = method; } public Map<String, String> getHeaders() { return headers; } public void setHeaders(Map<String, String> headers) { this.headers = headers; } public Map<String, String> getParameters() { return parameters; } public void setParameters(Map<String, String> parameters) { this.parameters = parameters; } }<pre name="code" class="java">public class Account implements Parcelable { private String account;// 账号 private String name;// 用户名 private String icon;// 用户图像 private int sex;// 性别 0:未设置 1:女 2:男 3:其他 private String sign;// 用户个性签名 private String area;// 用户所在区域 private String token;// 用户与服务器交互的唯一标 private boolean current;// 是否是当前用户 public Account() { } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public String getSign() { return sign; } public void setSign(String sign) { this.sign = sign; } public String getArea() { return area; } public void setArea(String area) { this.area = area; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public boolean isCurrent() { return current; } public void setCurrent(boolean current) { this.current = current; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } private Account(Parcel parcel) { Bundle val = parcel.readBundle(); account = val.getString("account"); name = val.getString("name"); icon = val.getString("icon"); sex = val.getInt("sex"); sign = val.getString("sign"); area = val.getString("area"); token = val.getString("token"); current = val.getBoolean("current"); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { Bundle val = new Bundle(); val.putString("account", account); val.putString("name", name); val.putString("icon", icon); val.putInt("sex", sex); val.putString("sign", sign); val.putString("area", area); val.putString("token", token); val.putBoolean("current", current); dest.writeBundle(val); } public static final Parcelable.Creator<Account> CREATOR = new Creator<Account>() { @Override public Account[] newArray(int size) { return new Account[size]; } @Override public Account createFromParcel(Parcel source) { return new Account(source); } }; @Override public String toString() { return "Account [account=" + account + ", name=" + name + ", icon=" + icon + ", sex=" + sex + ", sign=" + sign + ", area=" + area + ", token=" + token + ", current=" + current + "]"; } }
<pre name="code" class="java">String url = "http://192.168.1.101:8080/ChatServer/user/name"; Map<String, String> headers = new HashMap<String, String>(); headers.put("account", account.getAccount()); headers.put("token", account.getToken()); Map<String, String> parameters = new HashMap<String, String>(); parameters.put("name", text);
NetTask request = new NetTask();request.setUrl(url);request.setMethod(0);request.setHeaders(headers);request.setParameters(parameters);
②序列化
public class SerializableUtil { public static <T extends Serializable> void write(T t, String outPath) throws Exception { ObjectOutputStream oos = null; try { File file = new File(outPath); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } oos = new ObjectOutputStream(new FileOutputStream(file)); oos.writeObject(t); } finally { if (oos != null) { oos.close(); } } } public static Serializable read(String path) throws Exception { ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream(path)); Object object = ois.readObject(); if (object != null) { return (Serializable) object; } } finally { if (ois != null) { ois.close(); } } return null; } }
String outPath = DirUtil.getTaskDir(getActivity()) + "/" + System.currentTimeMillis(); try { SerializableUtil.write(request, outPath); } catch (Exception e) { e.printStackTrace(); }
2.页面跳转
。。。。跳转到自己的需求界面
3.当网络连接时,反序列化
①注册一个监听网络变化
public class ConnectedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 判断网络是否连接 String action = intent.getAction(); if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { if (CommonUtil.isNetConnected(context)) { // 网络已经连接 context.startService(new Intent(context, BackgroundService.class));//开启后台服务,必须此服务要求运行到子线程中 } } } }②后台service,IntentService 必须要实现无参构造函数,它运行在子线程中,如果IntentService 被start了多次,onHandleIntent()方法将排队执行多次
public class BackgroundService extends IntentService { // 1.构造函数应该注意的 public BackgroundService() { super("background");//随便写一个参数 // TODO Auto-generated constructor stub } @Override protected void onHandleIntent(Intent intent) { // 2. 此方法执行在子线程中 // 3. service start多次,此方法会排队执行 <pre name="code" class="java"><span style="white-space:pre"> </span>NetTask task = (NetTask) SerializableUtil.read(filePath); // TODO: 发送请求 // 改变状态值 //dao.updateState(id, 1); String url = task.getUrl(); Map<String, String> headers = task.getHeaders(); Map<String, String> paramaters = task.getParameters(); boolean result = HMHttpManaer.getInstance().post(url, headers, paramaters);//具体操作根据需求
}}
相关文章推荐
- 侧滑菜单
- C#Arcengine通过坐标点生成面(环形)
- 小折腾:JavaScript与元素间的抛物线轨迹运动
- Data包长度限制
- 第九周 项目三 人数不定工资类
- 使用Babel和ES7创建JavaScript模块
- C语言——数组与指针之动态分配一维和多维数组
- 解除javascript网页限制
- Spark RDD API详解(一) Map和Reduce
- 手把手教你写电商爬虫-第一课 找个软柿子捏捏
- vs 单元测试
- 修改sqlserver的数据库排序规则语句
- 注释转换
- GB2312、GBK和UTF-8三种编码以及QT中文显示乱码问题
- Matlab取棋子博弈问题
- Linux网络基础命令
- 丑数
- mybatis的多表查询
- OGG由于GGS处理SEQUENCE方式导致Ext延时_NOAUTOMATICSEQUENCEFLUSH处理
- python 在不同层级目录import 模块的方法