public abstract class AsyncRequestHandler<Result> extends Handler {
private static Looper sLooper = null;
private Handler mWorkerThreadHandler;
private static final int EVENT_ARG_REQUEST = 1;
protected class WorkerHandler extends Handler {
public WorkerHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
switch (msg.arg1) {
case EVENT_ARG_REQUEST:
Result r = onSendAyncRequest(msg.what);
Handler h = (Handler) msg.obj;
Message reply = h.obtainMessage(msg.what, r);
reply.arg1 = msg.arg1;
reply.sendToTarget();
break;
default:
break;
}
}
}
public AsyncRequestHandler() {
super();
synchronized (AsyncQueryHandler.class) {
if (sLooper == null) {
HandlerThread thread = new HandlerThread("AsyncRequestWorker");
thread.start();
sLooper = thread.getLooper();
}
}
mWorkerThreadHandler = createHandler(sLooper);
}
protected Handler createHandler(Looper looper) {
return new WorkerHandler(looper);
}
public void send(int token) {
Message msg = mWorkerThreadHandler.obtainMessage(token);
msg.arg1 = EVENT_ARG_REQUEST;
msg.obj = this;
mWorkerThreadHandler.sendMessage(msg);
}
public final void cancelOperation(int token) {
mWorkerThreadHandler.removeMessages(token);
}
abstract protected void onRequestComplete(int token, Result result);
abstract protected Result onSendAyncRequest(int token);
@Override
public void handleMessage(Message msg) {
// pass token back to caller on each callback.
switch (msg.arg1) {
case EVENT_ARG_REQUEST:
int token = msg.what;
Result result = (Result) msg.obj;
onRequestComplete(token, result);
break;
default:
break;
}
}
}
private static Looper sLooper = null;
private Handler mWorkerThreadHandler;
private static final int EVENT_ARG_REQUEST = 1;
protected class WorkerHandler extends Handler {
public WorkerHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
switch (msg.arg1) {
case EVENT_ARG_REQUEST:
Result r = onSendAyncRequest(msg.what);
Handler h = (Handler) msg.obj;
Message reply = h.obtainMessage(msg.what, r);
reply.arg1 = msg.arg1;
reply.sendToTarget();
break;
default:
break;
}
}
}
public AsyncRequestHandler() {
super();
synchronized (AsyncQueryHandler.class) {
if (sLooper == null) {
HandlerThread thread = new HandlerThread("AsyncRequestWorker");
thread.start();
sLooper = thread.getLooper();
}
}
mWorkerThreadHandler = createHandler(sLooper);
}
protected Handler createHandler(Looper looper) {
return new WorkerHandler(looper);
}
public void send(int token) {
Message msg = mWorkerThreadHandler.obtainMessage(token);
msg.arg1 = EVENT_ARG_REQUEST;
msg.obj = this;
mWorkerThreadHandler.sendMessage(msg);
}
public final void cancelOperation(int token) {
mWorkerThreadHandler.removeMessages(token);
}
abstract protected void onRequestComplete(int token, Result result);
abstract protected Result onSendAyncRequest(int token);
@Override
public void handleMessage(Message msg) {
// pass token back to caller on each callback.
switch (msg.arg1) {
case EVENT_ARG_REQUEST:
int token = msg.what;
Result result = (Result) msg.obj;
onRequestComplete(token, result);
break;
default:
break;
}
}
}