您的位置:首页 > 其它

设计模式_接口回调

2013-10-15 11:10 281 查看
在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



好了,,写的不好>.<,努力努力!以后会慢慢好的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: