java接口回调

在java组件编程时(如Android编程)时会十分频繁的使用到接口回调,以前我都没有发现,只是照着书上写的做。最常见的就是View.setonClickListener(new View.onClickListener())这样的语句了。因为最近看得代码也渐渐多起来了,所以很自然的就发现这个问题了,然后还好现在Android中的sdk源码都是可以直接查看的,现在我明白了。

   感觉接口回调也是一种多态的表现,过程就像View类中实现了onClickListener接口,即实现了onClickListener中的onClick方法。不过这个onClick方法只是一个空方法,我们使用一个继承自View的组件,如Button时,在为其注册onClickListener事件的过程中定义了具体的onClick实现方法。

   其实对于接口回调的思考是源自opensudoku代码,下面是其中的代码片段:

 

Java代码 复制代码  收藏代码
  1. private static class FolderListViewBinder implements ViewBinder {   
  2.         private Context mContext;   
  3.         private FolderDetailLoader mDetailLoader;   
  4.            
  5.            
  6.         public FolderListViewBinder(Context context) {   
  7.             mContext = context;   
  8.             mDetailLoader = new FolderDetailLoader(context);   
  9.         }   
  10.            
  11.         @Override  
  12.         public boolean setViewValue(View view, Cursor c, int columnIndex) {   
  13.   
  14.             switch (view.getId()) {   
  15.             case R.id.name:   
  16.                 ((TextView)view).setText(c.getString(columnIndex));   
  17.                 break;   
  18.             case R.id.detail:   
  19.                 final long folderID = c.getLong(columnIndex);   
  20.                 final TextView detailView = (TextView)view;   
  21.                 detailView.setText(mContext.getString(R.string.loading));   
  22.                 mDetailLoader.loadDetailAsync(folderID, new FolderDetailCallback() {   
  23.                     @Override  
  24.                     public void onLoaded(FolderInfo folderInfo) {   
  25.                         if (folderInfo != null)   
  26.                             detailView.setText(folderInfo.getDetail(mContext));   
  27.                     }   
  28.                 });   
  29.             }   
  30.                
  31.             return true;   
  32.         }   
  33.            
  34.         public void destroy() {   
  35.             mDetailLoader.destroy();   
  36.         }   
  37.     }  
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()一样,只是没有那么直观罢了。

 

Java代码 复制代码  收藏代码
  1. public void loadDetailAsync(long folderID, FolderDetailCallback loadedCallback) {   
  2.     final long folderIDFinal = folderID;   
  3.     final FolderDetailCallback loadedCallbackFinal = loadedCallback;   
  4.     mLoaderService.execute(new Runnable() {   
  5.         @Override  
  6.         public void run() {   
  7.             try {   
  8.             final FolderInfo folderInfo = mDatabase.getFolderInfoFull(folderIDFinal);   
  9.                
  10.             mGuiHandler.post(new Runnable() {   
  11.                 @Override  
  12.                 public void run() {   
  13.                     loadedCallbackFinal.onLoaded(folderInfo);   
  14.                 }   
  15.             });   
  16.             } catch (Exception e) {   
  17.                 // this is some unimportant background stuff, do not fail   
  18.                 Log.e(TAG, "Error occured while loading full folder info.", e);   
  19.             }   
  20.         }   
  21.     });  
	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方法。可能上面的描述不是很清楚,我这里写了一个简单的例子

    先定义一个接口:

Java代码 复制代码  收藏代码
  1. public interface MyInterface {   
  2.   
  3.     void call(int i);   
  4. }  
public interface MyInterface {

	void call(int i);
}

    再定义一个实现该接口空方法的类A:

Java代码 复制代码  收藏代码
  1. public class A {   
  2.        
  3.     public A() {   
  4.            
  5.     }   
  6.     public void make(MyInterface myInterface) {   
  7.         int i = 2;   
  8.         System.out.println("接口回调前的i:" + i);   
  9.         myInterface.call(i); //调用回调方法   
  10.     }   
  11. }  
public class A {
	
	public A() {
		
	}
	public void make(MyInterface myInterface) {
		int i = 2;
		System.out.println("接口回调前的i:" + i);
		myInterface.call(i); //调用回调方法
	}
}

   最后是一个测试类:

Java代码 复制代码  收藏代码
  1. public class B {   
  2.   
  3.     public static void main(String[] args){   
  4.         A a = new A();   
  5.         a.make(new MyInterface() {   
  6.                
  7.             @Override  
  8.             public void call(int i) {   
  9.                 i = i + 1;   
  10.                 System.out.println("接口回调后的i:" + i);   
  11.             }   
  12.         });   
  13.     }   
  14. }  
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

 

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值