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.     }  

 上面的是程序主界面中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.     });  

 上面是一个实现类似Handler的方法,不过它用了ExecutorService,可以看见参数是FolderDetailCallBack接口,而方法的实现则是调用了接口中定义的空方法,该空方法就是我们在setOnClickListener中实现的onCLick方法。可能上面的描述不是很清楚,我这里写了一个简单的例子

    先定义一个接口:

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

    再定义一个实现该接口空方法的类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. }  

   最后是一个测试类:

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. }  

输出:

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

 

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

你可能感兴趣的:(java,类)