您的位置:首页 > 其它

后台任务序列化与IntentService

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

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);
//具体操作根据需求

}}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: