后台任务序列化与IntentService

应用场景:当用户注册成功后,填写用户信息界面,断网了,此时点击了修改信息,出于友好考虑,应该将提交的数据,序列化保存到本地,然后允许用户继续访问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);
//具体操作根据需求
}}

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值