回调分为同步回调和异步回调。
java和android开发中,回调的应用无处不在,下面就以android中的点击事件为例子写一个回调的例子。监听按钮的点击事件,然后实现点击事件。回调具体的描述网上有很多的说法,但是看完都晕晕乎乎的,来个实际的例子说明回调吧。
异步回调的例子如下所示:
public class ClickController {
private static ClickController instance;
private ArrayList<ClickListener> list = new ArrayList();
private ClickController() {
}
public static ClickController getInstance() {
if (instance == null) {
instance = new ClickController();
}
return instance;
}
public void registerClickListener(ClickListener listener) {
if (listener != null) {
list.add(listener);
}
}
public void removeClickListener(ClickListener listener) {
if (listener != null) {
list.remove(listener);
}
}
//调用回调方法
public void click(boolean isLong) {
for(ClickListener listener:list) {
if (isLong) {
listener.onLongClick();
}else {
listener.onClick();
}
}
}
}
public class ClickManager implements ClickListener{
ClickController controller;
public void init() {
controller = ClickController.getInstance();
controller.registerClickListener(this);
}
//实现回调方法
@Override
public void onClick() {
// TODO 我这儿可以点击按钮去播放音乐,也可以去暂停音乐
System.out.println(Thread.currentThread()+"点击按钮");
}
@Override
public void onLongClick() {
// TODO 这儿可以去收藏音乐,或者取消收藏音乐
System.out.println(Thread.currentThread()+"长按按钮");
}
public static void main(String[] args) {
System.out.println(Thread.currentThread());
ClickManager manager = new ClickManager();
manager.init();
//这里开启一个线程用异步的方式实现按钮的长按点击事件,
//实际实现中肯定使用了屏幕的触摸事件等去判断点击了某个按钮,
//这儿只是做一个模拟。去调用回调方法。
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
ClickController.getInstance().click(true);
}
}).start();
//这里开启一个线程用异步的方式实现按钮的短按点击事件
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
ClickController.getInstance().click(false);
}
}).start();
}
}
public interface ClickListener {
void onClick();
void onLongClick();
}
运行结果为:
Thread[main,5,main]
Thread[Thread-0,5,main]长按按钮
Thread[Thread-1,5,main]点击按钮