0

所以现在,我正在尝试实现一个异步调用,它调用我的 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() 方法。顺便说一句,所有异常都已处理,并使用回调发送回被调用者。

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

请帮忙。

4

2 回答 2

0

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

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

public class Callee implements OnRequestFinishedListener {
      private final ExecutorService executor = Executors.newSingleThreadExecutor();
 ...
      BasicHttpClientAsync httpClient = new BasicHttpClientAsync(this, executor);
 ...
于 2012-04-19T19:57:33.053 回答
0

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

于 2012-04-25T02:11:40.883 回答