Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java Callable和Future设计AsyncTask?_Java_Android_Android Asynctask_Java.util.concurrent_Callable - Fatal编程技术网

如何使用Java Callable和Future设计AsyncTask?

如何使用Java Callable和Future设计AsyncTask?,java,android,android-asynctask,java.util.concurrent,callable,Java,Android,Android Asynctask,Java.util.concurrent,Callable,我正在研究Android类的Java实现 我正在使用Java的未来类和可调用类。以下是我的异步任务:- public abstract class AsyncTask<Params,Result>{ ExecutorService executor = Executors.newFixedThreadPool(10); protected abstract Result runInBackground(Params params); protected a

我正在研究Android类的Java实现 我正在使用Java的未来类和可调用类。以下是我的异步任务:-

public abstract class AsyncTask<Params,Result>{

    ExecutorService executor = Executors.newFixedThreadPool(10);

    protected abstract Result runInBackground(Params params);
    protected abstract void postExecute(Result result);
    private Future<Result> future;

    public void execute(Params params) {
        future = executor.submit(new AsyncCallable<Params, Result>(params, this));
        try {
            postExecute(future.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }

}
如果您看到,我的代码不是异步运行的,也就是说,我的两个异步任务都是在同一个线程上实现的。这就是为什么它要等待第一个任务完成,然后调用第二个异步任务。
你能帮我找出我未来代码中的问题吗?get()。详细说明Boris所说的:您的代码在后台线程中工作(输出中有pool-1-thread-1)。但是每次调用execute()都会调用future.get(),这是一个阻塞调用,等待任务完成。但是你能推荐其他方法吗?我可以通过它在任务完成时调用postExecute()方法。我不是在execute()方法中调用postExecute(future.get()),而是在call()方法中调用postExecute()。现在它正在异步工作。您还可以检查AsyncTask的源代码:
public class AsyncCallable<Params,Result> implements Callable<Result>{

    private Params params;
    private AsyncTask<Params, Result> asyncTask;

    public AsyncCallable(Params params,AsyncTask<Params, Result> asyncTask) {
        this.params = params;
        this.asyncTask = asyncTask;
    }

    @Override
    public Result call() throws Exception {
        System.out.println(Thread.currentThread().getName()+" is executing");
        return asyncTask.runInBackground(params);
    }

}
public static void main(String args[]){
        new AsyncTask<String, String>() {

            @Override
            protected String runInBackground(String params) {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return "Hello "+params;
            }

            @Override
            protected void postExecute(String result) {
                System.out.println(result+" AFter 10 sec");

            }

        }.execute("World");
        new AsyncTask<String, String>() {

            @Override
            protected String runInBackground(String params) {
                try {
                    //Thread.sleep(2000);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return "Hello "+params;
            }

            @Override
            protected void postExecute(String result) {
                System.out.println(result+" AFter 2 sec");

            }

        }.execute("World");
    }
pool-1-thread-1 is executing
Hello World AFter 10 sec
pool-2-thread-1 is executing
Hello World AFter 2 sec