在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
好了,,写的不好>.<,努力努力!以后会慢慢好的。