在java组件编程时(如Android编程)时会十分频繁的使用到接口回调,以前我都没有发现,只是照着书上写的做。最常见的就是View.setonClickListener(new View.onClickListener())这样的语句了。因为最近看得代码也渐渐多起来了,所以很自然的就发现这个问题了,然后还好现在Android中的sdk源码都是可以直接查看的,现在我明白了。
感觉接口回调也是一种多态的表现,过程就像View类中实现了onClickListener接口,即实现了onClickListener中的onClick方法。不过这个onClick方法只是一个空方法,我们使用一个继承自View的组件,如Button时,在为其注册onClickListener事件的过程中定义了具体的onClick实现方法。
其实对于接口回调的思考是源自opensudoku代码,下面是其中的代码片段:
private static class FolderListViewBinder implements ViewBinder {
private Context mContext;
private FolderDetailLoader mDetailLoader;
public FolderListViewBinder(Context context) {
mContext = context;
mDetailLoader = new FolderDetailLoader(context);
}
@Override
public boolean setViewValue(View view, Cursor c, int columnIndex) {
switch (view.getId()) {
case R.id.name:
((TextView)view).setText(c.getString(columnIndex));
break;
case R.id.detail:
final long folderID = c.getLong(columnIndex);
final TextView detailView = (TextView)view;
detailView.setText(mContext.getString(R.string.loading));
mDetailLoader.loadDetailAsync(folderID, new FolderDetailCallback() {
@Override
public void onLoaded(FolderInfo folderInfo) {
if (folderInfo != null)
detailView.setText(folderInfo.getDetail(mContext));
}
});
}
return true;
}
public void destroy() {
mDetailLoader.destroy();
}
}
上面的是程序主界面中listview的viewbinder类的定义,可以看到语句mDetailLoader.loadDetailAsy...这条语句,它就相当于View.setonClickListener()一样,只是没有那么直观罢了。
public void loadDetailAsync(long folderID, FolderDetailCallback loadedCallback) {
final long folderIDFinal = folderID;
final FolderDetailCallback loadedCallbackFinal = loadedCallback;
mLoaderService.execute(new Runnable() {
@Override
public void run() {
try {
final FolderInfo folderInfo = mDatabase.getFolderInfoFull(folderIDFinal);
mGuiHandler.post(new Runnable() {
@Override
public void run() {
loadedCallbackFinal.onLoaded(folderInfo);
}
});
} catch (Exception e) {
// this is some unimportant background stuff, do not fail
Log.e(TAG, "Error occured while loading full folder info.", e);
}
}
});
上面是一个实现类似Handler的方法,不过它用了ExecutorService,可以看见参数是FolderDetailCallBack接口,而方法的实现则是调用了接口中定义的空方法,该空方法就是我们在setOnClickListener中实现的onCLick方法。可能上面的描述不是很清楚,我这里写了一个简单的例子
先定义一个接口:
public interface MyInterface {
void call(int i);
}
再定义一个实现该接口空方法的类A:
public class A {
public A() {
}
public void make(MyInterface myInterface) {
int i = 2;
System.out.println("接口回调前的i:" + i);
myInterface.call(i); //调用回调方法
}
}
最后是一个测试类:
public class B {
public static void main(String[] args){
A a = new A();
a.make(new MyInterface() {
@Override
public void call(int i) {
i = i + 1;
System.out.println("接口回调后的i:" + i);
}
});
}
}
输出:
接口回调前的i:2
接口回调后的i:3
好了,,写的不好>.<,努力努力!以后会慢慢好的。