在这种情况下,我需要创建一个具有可调用性的FutureTask,检查它的所有者是否已被取消。我的代码如下所示:
public static FutureTask<Result> makeFuture(final Call call, final TaskCompletionCallback completion) {
return new FutureTask<Result>(new Callable<Result>() {
@Override
public Result call() throws Exception {
Result result = CYLib.doNetworkRequest(call, new CarryOnCallback() {
@Override
public boolean shouldCarryOn() {
return !FutureTask.isDone();
}
});
return result;
}
});
}基本上,doNetworkRequest会询问CarryOnCallback是否应该在操作期间的特定时间继续。对于这个回调,我想看看是否取消了调用doNetworkRequest的doNetworkRequest,这涉及到查询实际的FutureTask对象。
现在我知道你不能真正访问‘这个’,因为它还没有被建造。但有没有办法解决这个问题,或者为我的情况设计一个更好的方案?
干杯
编辑:
好的,我现在就这样做。做了一个定制的可调用和FutureTask。可调用保存对FutureTask的引用,这可以在创建新的可调用性之后手动设置:
public static MyTask makeMyTask(final Call call, final TaskCompletionCallback completion) {
MyTask task = null;
MyTask.InnerCallable innerCallable = new MyTask.InnerCallable(call, completion);
task = new MyTask(innerCallable);
innerCallable.setParent(task);
return task;
}仅供参考,InnerCallable看起来如下:
public static class MyTask extends FutureTask<Result> {
InnerCallable callable;
public MyTask(InnerCallable callable) {
super(callable);
this.callable = callable;
}
private static class InnerCallable implements Callable<Result> {
private final Call call;
private final TaskCompletionCallback completion;
private WeakReference<MyTask> parentTask;
InnerCallable(Call call, TaskCompletionCallback completion) {
this.call = call;
this.completion = completion;
}
@Override
public Result call() {
Result result = CYLib.doNetworkRequest(this.call, new CarryOnCallback() {
@Override
public boolean shouldCarryOn() {
MyTask task = parentTask.get();
return !(task == null || task.isCancelled());
}
});
return result;
}
private void setParent(MyTask parentTask) {
this.parentTask = new WeakReference<MyTask>(parentTask);
}
}
}发布于 2013-10-27 12:44:20
那么,您的CYLib.doNetworkRequest()在另一个线程中工作吗?
private static Map<Call,FutureTask> map=new HashMap();
public static FutureTask<Result> makeFuture(final Call call, final TaskCompletionCallback completion) {
FutureTask<Result> futureResult = new FutureTask<Result>(new Callable<Result>() {
@Override
public Result call() throws Exception {
Result result = CYLib.doNetworkRequest(call, new CarryOnCallback() {
@Override
public boolean shouldCarryOn() {
return !map.get(call).isCancelled();
}
});
return result;
}
});
map.put(call,futureResult);
return futureResult;
}https://stackoverflow.com/questions/18307420
复制相似问题