首页 > 代码库 > java中回调

java中回调

不管在java中还是android中回调都用的很多,比如自定义listview 下拉刷新,listview这个类并不知道下拉中要去实现什么功能,而只知道当用户下拉要刷新,这不就是接口的作用么,接口只定义外观,具体的实现要子类去实现,这是其一,其二,listview既然不知道下拉刷新的功能是什么,还要等调用他的类去实现,因此就要用到回调,


回调的定义:

用我个人理解的话:就是某个功能,在中间某段并不知道要实现什么,要等外部调用者调用时才知道,而在某个功能中只知道要实现什么功能,但是具体的实现确实在调用类中实现,这就是接口回调,现在用代码来解释更明白


首先定义一个接口,用于回调的

/**
 * 用于回调的接口
 */
public interface OnClickListener {
	void onClick();
}

在定义一个Button,用于实现某些功能,

public class Button {
	private OnClickListener listener;
	private MyInterface interfacer;
	public void setOnClickListener(final OnClickListener listener) {
		this.listener = listener;
	}
}

这是模拟android中button的点击事件,

MainClass.java

public class MainClass implements OnClickListener  {
     public static void main(String[] args) {
    	 System.out.println("this is main");  
    	 new MainClass().callBack();
	}
     
     public void callBack(){
    	 Button btn = new Button();  
    	 btn.setOnClickListener(this);
     }

	@Override
	public void onClick() {
			System.out.println("接口回调");
	}
}


打印结果:

this is main
接口回调

现在分析回调,

1:首先定义一个接口,用于回调,

2:在要被调用的类中,在这个代码中Button就是要调用的类,在这个类中setOnClickListener()方法并没有实现任何代码,只是调用了接口中的OnClick()方法,相当于声明方法体,并没有具体的实现,而在MainClass类中我们发现OnClick()方法中打印了一句话System.out.println("接口回调");这可以看做是onClick()方法具体的实现,所以说回调的方法是 声明和实现分离的,

3:注册监听器:public void setOnClickListener(OnClickListener listener) ;这个方法就是注册监听器,然后定义变量接受外部传递过来的接口变量,在外部传递过来的是接口的实现类,这里就用到了多态的概念了,

4:在Button类中定义一个方法实现某一逻辑,但是这个逻辑也是某个部分不知道怎么实现,

代码部分改动:

Button.java

public class Button {
	private OnClickListener listener;
	public void setOnClickListener(OnClickListener listener) {
		this.listener = listener;
	}
	
	public void move(){
		System.out.println("移动前------");
		listener.onClick();//比如移动中要处理很多业务
		System.out.println("移动后------");
	}
}

MainClass.java

public class MainClass implements OnClickListener  {
     public static void main(String[] args) {
    	 new MainClass().callBack();
	}
     public void callBack(){
    	 Button btn = new Button();  
    	 btn.setOnClickListener(this);
    	 btn.move();
     }
	@Override
	public void onClick() {
			System.out.println("移动中................");
	}
}


调用类要做的事:

1:new 一个被调用类的对象

2:然后注册监听器

具体的代码提现在:

 Button btn = new Button();  
 btn.setOnClickListener(this);
被调用类还有一种写法:
Button.java<pre class="java" name="code">public class Button {
	public void setOnClickListener(OnClickListener listener) {
		System.out.println("移动前------");
		listener.onClick();//比如移动中要处理很多业务
		System.out.println("移动后------");
	}
}

调用者也有一个写法:

public class MainClass  {
     public static void main(String[] args) {
    	 new MainClass().callBack();
	}
     public void callBack(){
    	 Button btn = new Button();  
    	 btn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick() {
				System.out.println("移动中................");
			}
		});
     }
}

大家可以对比android中一些view的点击事件来看,就是这样的,理解接口对学设计模块有很大的帮助!希望大家一起好好学习,有什么地方讲的不对,请回复!








java中回调