使用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”似乎从未被调用
请帮忙
# 1 楼答案
事实证明,这是因为我没有将apache的HttpComponents的所有JAR添加到我的Java构建路径中,这导致HttpClient mHttpClient=new DefaultHttpClient()抛出了一个异常。但是,我使用的是Runnable,因此我无法捕获该异常
# 2 楼答案
一种可能性是
run
异常中的某个地方被抛出,所以执行流永远不会到达对侦听器的调用顺便说一句,您不需要在每次调用时创建
executor
,这削弱了executor将预先创建的线程集中在一起等待传入工作的优势。使BasicHttpClientAsync
构造函数参数的执行器参数: