参考例子:android的Button OnClickListener接口、《第一行代码》中的回调例子
定义接口
public interface HttpCallbackListener{
void onFinish(Stringresponse);
void onError(Exceptione);
}
调用接口
publicclassHttpUtil{
publicstaticvoid sendHttpRequest( finalStringaddress,final HttpCallbackListener listener){
newThread(newRunnable(){
@Override
publicvoid run(){
HttpURLConnection connection = null;
try{
URLurl= newURL(address);
connection =(HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
connection.setDoInput(true);
connection.setDoOutput(true);
InputStreamin= connection.getInputStream();
BufferedReaderreader= newBufferedReader(new InputStreamReader(in));
StringBuilderresponse= newStringBuilder();
String line;
while((line = reader.readLine())!= null){
response.append(line);
}
if(listener != null){
//回调onFinish()方法
listener.onFinish(response.toString());
}
}catch(Exceptione){
if(listener != null){
//回调onError()方法
listener.onError(e);
}
}finally{
if(connection != null){
connection.disconnect();
}
}
}
}).start();
}
}
实现接口,参数传入
HttpUtil.sendHttpRequest(address,newHttpCallbackListener(){
@Override
publicvoidonFinish(Stringresponse){
//在这里根据返回内容执行具体的逻辑
}
@Override
publicvoidonError(Exceptione){
//在这里对异常情况进行处理
}
});
回调机制适用情景:
回调通常是在两个不同的线程间需要同步的情况下才出现的(见极客学院项目教程《智能聊天机器人》)
多在框架开发中使用,回调的接口由具体的应用者自行设计与实现。
在三层中,当业务层调用数据层时,是不需要把业务层自身传递到数据层的,并且这是一种上层调用下层的关系,比如我们在用框架的时候,一般直接调用框架提供 的API就可以了,但回调不同,当框架不能满足需求,我们想让框架来调用自己的类方法,怎么做呢?总不至于去修改框架吧。许多优秀的框架提几乎都供了相关 的接口,我们只需要实现相关接口,即可完成了注册,然后在合适的时候让框架来调用我们自己的类,还记不记得我们在使用Struts时,当我们编写 Action时,就需要继承Action类,然后实现execute()方法,在execute()方法中写咱们自己的业务逻辑代码,完成对用户请求的处 理。由此可以猜测,框架和容器中会提供大量的回调接口,以满足个性化的定制。
即:为了使我们写的函数接近完美,就把一部分功能外包给别人,让别人个性化定制,至于别人怎么实现不管,我唯一要做的就是定义好相关接口,这一设计允许了底层代码调用高层定义的子程序,增强程序灵活性,和反射有着异曲同工之妙。