实现接口回调
1.概述接口回调
通过Java中的接口,我们可以实现回调。比如下载资源完成自动做某些事,浏览网页加载完内容使得内容可见等等。
2.原理
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
情景模式
A---接口类,下载监听接口OnLoadListener------含有onLoadCompleted()
B---工具类,如下载监听工具LoadUtils----------含有setLoadListener(onLoadListener listener)
将listener赋给LoadUtils中的OnLoadListener变量
C---调用B的A的实现类,添加一个LoadUtils的变量load,并为其设置监听器setLoadListener(this);//实现了OnLoadListener的类
在C中设置了监听器,如果B中下载完成,因为B中的listener是C传递过来的所以可由B调用C中的onLoadCompleted()函数完成监听。
Java 中没有指针的概念,通过接口和内部类的方式实现回调的功能:
3.一般步骤
声明接口:OnLoadListener
package
public interface
void
}
中间类:LoadUtils
声明一个接口变量,并提供监听器设置接口,在这个类中通过传递过来的listener实现回调DoItService的onLoadCompleted()方法
package com.ccp.wj.doit.utils;
public class LocationUtils {
private static final String tag = "LoationUtils";
public LocationUtils(){
mContext = DoItApplication.getContext();
}
/*
* 设置定位监听,将实现了onLoadCompleted()方法的listener赋给该工具类
*/
public void
this.listener
}
。。。
//当下载完成则通过listener调用继承类的onLoadCompleted()方法实现回调
Listener.onLoadCompleted(curCity);//通知监听完
继承类:DoItService
实现接口,并为中间类设置监听器,即将实现了接口的类的listener传递给中间类,以便当中间类完成了事务,可以由传递过来的listener回调继承类的实现了接口类的方法。
package com.ccp.wj.doit.service;
public class DoItService extends Service implements OnLocatedCityListener{
InternetReceiver ir;
private String tag = "DoItService";
public DoItService(){
mWDA = new WeatherDetailActivity();
}
/**
* 提供给外部的天气接口
*/
public Object[]getCurWeather(){
LocationUtils locUtil = new LocationUtils();
locUtil.setOnLocatedListener(this);
locUtil.getCity();
return null;
}
@Override
public void onLocatedCityFinished(String city) {
}
}
二.仿Button实现回调函数
仿用户界面Button控件回调实现 |
package ccp.wj.buttonCallback;
/**
*
* @author ChenChunPeng
*/
public interface OnClickListener {
public void OnClicked();
}
Button中间类
import ccp.wj.buttonCallback.OnClickListener;
public class Button1{
private OnClickListener listener = null;
public void buttonClicked(){//模拟按键按下
listener.onClick();//调用listener的onClick实现回调
}
public void setOnClickListener(OnClickListener listener){
this.listener = listener;
}).start();
}
}
继承自接口的实现类
package ccp.wj.buttonCallback
/**
*
* @author ChenChunPeng
*/
public class InterfaceUsing {
/**
* @param args the command line arguments
*/
}
public void init(){
Button1 btn = new Button1();
btn.setOnClickListener(new OnClickListener(){
@Override
public void OnLoadCompleted() {
System.out.print("这次真的实现了回调函数了!");
}
});
btn.buttonClicked();//模拟用户按下按键
}
//主测试方法
public static void main(String[] args) {
// TODO code application logic here
System.out.print("starting callback....\n");
new InterfaceUsing().init();
}
}