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

时间:2012-04-19 19:50:24

标签: java asynchronous callback futuretask

所以现在,我正在尝试实现一个异步调用,它调用我的BasicHttpClient来从互联网上获取Http响应,当Http客户端完成它的工作时,它调用了一个Callee类的方法。

通常,我的实现看起来像这样。

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()方法调用Callee类的getResult()方法。 btw已经处理了所有异常,并使用回调函数发回给被调用者。

然而,Callee类中的“onRequestFinished”似乎永远不会被调用。

请帮助。

2 个答案:

答案 0 :(得分:0)

一种可能性是抛出run异常中的某个地方,因此执行流程永远不会调用侦听器。

顺便说一句,您不需要在每次调用时创建executor,这会减少执行程序汇集预先创建的线程等待传入工作的优势。创建BasicHttpClientAsync构造函数参数的执行程序参数:

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

答案 1 :(得分:0)

原来是因为我没有将所有jar的apache的HttpComponents添加到我的Java Build Path中,导致HttpClient mHttpClient = new DefaultHttpClient()抛出异常。但是,我正在使用Runnable,所以我无法捕获该异常。