首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FutureTask具有引用FutureTask的可调用性

FutureTask具有引用FutureTask的可调用性
EN

Stack Overflow用户
提问于 2013-08-19 06:14:22
回答 1查看 683关注 0票数 0

在这种情况下,我需要创建一个具有可调用性的FutureTask,检查它的所有者是否已被取消。我的代码如下所示:

代码语言:javascript
复制
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是否应该在操作期间的特定时间继续。对于这个回调,我想看看是否取消了调用doNetworkRequestdoNetworkRequest,这涉及到查询实际的FutureTask对象。

现在我知道你不能真正访问‘这个’,因为它还没有被建造。但有没有办法解决这个问题,或者为我的情况设计一个更好的方案?

干杯

编辑:

好的,我现在就这样做。做了一个定制的可调用和FutureTask。可调用保存对FutureTask的引用,这可以在创建新的可调用性之后手动设置:

代码语言:javascript
复制
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看起来如下:

代码语言:javascript
复制
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);
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-10-27 12:44:20

那么,您的CYLib.doNetworkRequest()在另一个线程中工作吗?

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18307420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档