有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用FutureTask和回调实现异步调用的java

所以现在,我正在尝试实现一个异步调用,它调用我的BasicHttpClient从internet获取Http响应,当Http客户端完成其工作时,它调用被调用方类的一个方法

一般来说,我的实现是这样的

public class BasicHttpClientAsync {
    private OnRequestFinishedListener mListener;

    public interface OnRequestFinishedListener {
        public void onRequestFinished(HttpResponse httpResponse);

        public void onRequestFinished(ClientProtocolException e);

        public void onRequestFinished(IOException e);
    }

    public BasicHttpClient(OnRequestFinishedListener listener) {
        this.mListener = listener;
    }

    private Runnable task = new Runnable() {
        @override
        public void run() {
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(URL);
            HttpResponse httpResponse = httpClient.execute(httpGet);

            mListener.onRequestFinished(httpResponse);
        }
    };

    public void getResponse() {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        FuturkTask<?> futureTask = new FutureTask<Object>(task, null);
        executor.execute(futureTask);
    }
}

public class Callee implements OnRequestFinishedListener {
    public void getResult() {
        BasicHttpClientAsync httpClient = new BasicHttpClientAsync(this);
        httpClient.getResponse();
    }

    @override
    public void onRequestFinished(HttpResponse httpResponse) {
        System.out.println(httpResponse.toString());
    }
}

代码已经大大简化,main()方法调用被调用类的getResult()方法。顺便说一句,所有异常都已处理,并使用回调将其发送回被调用方

然而,被调用方类中的“onRequestFinished”似乎从未被调用

请帮忙


共 (2) 个答案

  1. # 1 楼答案

    事实证明,这是因为我没有将apache的HttpComponents的所有JAR添加到我的Java构建路径中,这导致HttpClient mHttpClient=new DefaultHttpClient()抛出了一个异常。但是,我使用的是Runnable,因此我无法捕获该异常

  2. # 2 楼答案

    一种可能性是run异常中的某个地方被抛出,所以执行流永远不会到达对侦听器的调用

    顺便说一句,您不需要在每次调用时创建executor,这削弱了executor将预先创建的线程集中在一起等待传入工作的优势。使BasicHttpClientAsync构造函数参数的执行器参数:

    public class Callee implements OnRequestFinishedListener {
          private final ExecutorService executor = Executors.newSingleThreadExecutor();
     ...
          BasicHttpClientAsync httpClient = new BasicHttpClientAsync(this, executor);
     ...