后台任务序列化与IntentService

来源:互联网 发布:springmvc json转对象 编辑:程序博客网 时间:2024/06/18 16:35

应用场景:当用户注册成功后,填写用户信息界面,断网了,此时点击了修改信息,出于友好考虑,应该将提交的数据,序列化保存到本地,然后允许用户继续访问app。等到下次联网时,将修改的数据自动提交到服务器

1.将请求加入到后台任务

请求——封装为javabean——序列化文件

①封装为网络请求

public class NetTask implements Serializable {/** *  */private static final long serialVersionUID = 1L;private String url;private int method;// 0:post 1: getprivate 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");}@Overridepublic int describeContents() {return 0;}@Overridepublic 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>() {@Overridepublic Account[] newArray(int size) {return new Account[size];}@Overridepublic Account createFromParcel(Parcel source) {return new Account(source);}};@Overridepublic 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 {@Overridepublic 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}@Overrideprotected 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);
//具体操作根据需求
}}




0 0
原创粉丝点击