感觉接口回调也是一种多态的表现,过程就像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();
- }
- }
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);
- }
- }
- });
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);
- }
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 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);
- }
- });
- }
- }
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
好了,,写的不好>.<,努力努力!以后会慢慢好的。




被折叠的 条评论
为什么被折叠?



