读书人

设计方式_接口回调

发布时间: 2012-12-23 11:28:15 作者: rapoo

设计模式_接口回调

??? 在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);}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void run() {try {final FolderInfo folderInfo = mDatabase.getFolderInfoFull(folderIDFinal);mGuiHandler.post(new Runnable() {@Overridepublic void run() {loadedCallbackFinal.onLoaded(folderInfo);}});} catch (Exception e) {// this is some unimportant background stuff, do not failLog.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() {@Overridepublic void call(int i) {i = i + 1;System.out.println("接口回调后的i:" + i);}});}}

输出:

接口回调前的i:2
接口回调后的i:3

?

?好了,,写的不好>.<,努力努力!以后会慢慢好的。

读书人网 >软件开发

热点推荐