一:回调的用途
回调一般用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调。例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。
所谓的回调,就是程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。
二:JAVA实现接口回调
1.回调接口
点击(此处)折叠或打开
public interface CallbackInterface {
public void callbackMethod();
}
2.接口引用
点击(此处)折叠或打开
public class Caller {
public CallbackInterface callback;
/**
* @param callback
* the callback to set
*/
public void setCallback(CallbackInterface callback) {
this.callback = callback;
}
public void call() {
this.callback.callbackMethod();
}
}
3.接口回调类
点击(此处)折叠或打开
public class Client implements CallbackInterface{
/* (non-Javadoc)
* @see com.enjoylink.gmap.mongodb.demo.CallbackInterface#callbackMethod()
*/
@Override
public void callbackMethod() {
System.out.println("this is the client callbackMethod.");
}
}
4.测试类
点击(此处)折叠或打开
public class CallbackTest {
public static void main(String[] args) {
Caller caller = new Caller();
// Client client = new Client();
// caller.setCallback(client);
caller.setCallback(new CallbackInterface() {
@Override
public void callbackMethod() {
System.out.println("匿名类回调");
}
});
caller.call();
}
}
三:Spring JdbcTemplate中的回调实例
对于spring的JdbcTemplate进行结果集查询操作,spring给我们开发的是一系列的query方法,这些查询的方法中回调的接口主有三种:ResultSetExtractor,RowCallbackHandler,RowMapper,这个内容有图有真相:
1.ResultSetExtractor
点击(此处)折叠或打开
public interface ResultSetExtractor {
Object extractData(ResultSet rs) throws SQLException,
DataAccessException;
}
点击(此处)折叠或打开
List userList = (List)jdbcDao.getJdbcTemplate().
query("select * from T_USER", new ResultSetExtractor() {
@Override
public Object extractData(ResultSet rs) throws SQLException,
DataAccessException {
List userList = new ArrayList();
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("N_ID"));
user.setName(rs.getString("C_NAME"));
userList.add(user);
}
return userList;
}
});
2.RowCallbackHandler
点击(此处)折叠或打开
public interface RowCallbackHandler {
void processRow(ResultSet rs) throws SQLException;
}
点击(此处)折叠或打开
final List userList = new ArrayList();
jdbcDao.getJdbcTemplate().query("select * from T_USER",
new RowCallbackHandler(){
@Override
public void processRow(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getInt("N_ID"));
user.setName(rs.getString("C_NAME"));
userList.add(user);
}
});
3.RowMapper
点击(此处)折叠或打开
public interface RowMapper {
Object mapRow(ResultSet rs, int rowNum) throws SQLException;
}
点击(此处)折叠或打开
List userList = (List)jdbcDao.getJdbcTemplate().
query("select * from T_USER", new RowMapper(){
@Override
public Object mapRow(ResultSet rs, int rowNumber)
throws SQLException {
User user = new User();
user.setId(rs.getInt("N_ID"));
user.setName(rs.getString("C_NAME"));
return user;
}
});
四:Android中的接口回调
在android中回调机制被大量的使用。比如,在Activity中定义了很多生命周期的不同状态要调用的方法,这些方法都是空实现,系统框架要调用,用户也要调用来实现。
举个简单的例子就是Button的点击响应事件实现机制
点击(此处)折叠或打开
button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
}
});
OnClickListener就是android系统所约好的接口,然后在我们写的应用程序中传入回调对象,这样就可以达到接口统一,实现不同的效果。