package com.volley.air;
import android.os.Handler;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by Jason Chen on 2015/8/18.
* 网络线程处理者
*/
public class TaskHandle {
public static final byte RESULT_NOT_DOING = 0;
public static final byte RESULT_NOT_BORN = 1;
public static final byte RESULT_COME_OUT = 2;
public static final byte RESULT_EXCEPTION = -1;
protected static final byte IDLE = 0;
protected static final byte WAITTING = 1;
protected static final byte RUNNING = 2;
protected static final byte RAN_NORMAL = 3;
protected static final byte HANDLING = 4;
protected static final byte DONE = 5;
protected static final byte RAN_EXCEPTIONAL = 6;
protected static final byte CANCELLED = 7;
private class FinalRunner implements Runnable {
private final byte type;
FinalRunner(byte runType) {
type = runType;
}
@Override
public void run() {
Receiver rec = receiver;
Object result = outcome;
if (type == RAN_NORMAL) {
if (state.compareAndSet(RAN_NORMAL, HANDLING)) {
rec.onSuccess(TaskHandle.this, result);
if (state.compareAndSet(HANDLING, DONE)) {
onFinal();
}
}
} else if (type == RAN_EXCEPTIONAL) {
if (state.compareAndSet(RAN_EXCEPTIONAL, RAN_EXCEPTIONAL)) {
rec.onError(TaskHandle.this, (Throwable) result);
}
}
}
}
/*********************************************************************************************/
protected AtomicInteger state;
private Executor executor;
private HttpRequest request;
private Receiver<?> receiver;
private Processor processor;
private Handler handler;
private int id;
private byte rs;
private Object outcome;
public TaskHandle(TaskCenter center, HttpRequest request, Processor processor) {
this(center, center.getHandler(), request, processor);
}
public TaskHandle(Executor executor, Handler handler, HttpRequest request, Processor processor) {
this.executor = executor;
this.request = request;
this.processor = processor;
this.handler = handler;
state = new AtomicInteger(IDLE);
rs = RESULT_NOT_BORN;
outcome = null;
}
//Task结束,重置参数
protected void onFinal() {
executor = null;
handler = null;
receiver = null;
request = null;
processor = null;
}
private boolean isCancelled() {
for (int s; ; ) {
s = state.get();
if (s >= DONE)
return true;
if (state.compareAndSet(s, s)) {
return false;
}
}
}
/**
* View给自己的网络请求线程设置id
*/
public void setId(int id) {
this.id = id;
}
public int id() {
return id;
}
/**
* View给自己的网络请求线程设置结果接收器,一般是调用者View自己
*/
public boolean setReceiver(Receiver<?> receiver) {
if (receiver == null)
throw new IllegalArgumentException(Helper.shouldntNull("receiver"));
for (int s; ; ) {
s = state.get(); // 获取AtomicInteger当前的值(表示任务进展到了哪一步)
if (s >= DONE) { // DONE,异常,或者cancel
if (rs != RESULT_COME_OUT) // not run over.
return false;
Receiver rec = receiver;
rec.onSuccess(this, outcome);
return true;
}
if (state.compareAndSet(s, s)) {
this.receiver = receiver;
return true;
}
}
}
/**
* 取消线程
*/
public boolean cancel() {
for (int s; ; ) {
s = state.get();
if (s >= DONE) // 如果任务已经进行到了5,6,7,则不能被cancel
return false;
if (state.compareAndSet(s, CANCELLED)) {
onFinal(); //清空TaskHandle所有成员变量,取消任务
return true;
}
}
}
/**
* View给自己的网络请求线程推进,启动Volley的请求
*/
public boolean pullTrigger() {
Executor et = executor;
if (state.compareAndSet(IDLE, WAITTING)) {
et.execute(new Runnable() {
@Override
public void run() {
Processor pro = processor;
if (state.compareAndSet(WAITTING, RUNNING)) {
if (null != pro) {
try {
setFinal(RAN_NORMAL, pro.process(request));
} catch (Throwable ex) {
ex.printStackTrace();
setFinal(RAN_EXCEPTIONAL, ex);
}
}
}
}
});
return true;
}
return false;
}
/**
* 根据Volley进程得到的结果,通知接收器处理结果
* 通过Handler读取消息队列中的请求,当读取到网络请求结果的消息,则通知Receiver处理结果
*/
private void setFinal(byte newState, Object data) {
outcome = data;
rs = newState == RAN_NORMAL ? RESULT_COME_OUT : RESULT_EXCEPTION;
if (state.compareAndSet(RUNNING, newState)) {
if (receiver != null) {
handler.post(new FinalRunner(newState));
executor = null;
} else {
onFinal();
}
}
}
}