Android和Java中经常遇到有接口回调的代码,之前用的时候也不是太清楚,什么情况下适合用,具体怎么用,脑子中还没有较为清晰的理解。网上也是一大堆各种例子讲解,鱼龙混杂,现对回调函数用自己的理解做个整理,加深自己的印象,不足之处,日后再行补充。
首先拿最常见的Button
的点击事件举例来说:
代码:
public class MainActivity extends AppCompatActivity {
private Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new View.OnClickListener() {//B规定的接口
@Override
public void onClick(View view) {//回调函数
bt.setText("被点击了→_→")
}
});
}
}
View的源码中有接口如下:
public static interface OnClickListener {
void onClick(android.view.View view);
}
我(A),系统代码(B)
A调用B的setOnClickListener
方法,B再回调A写的方法onClick
,onClick
为回调函数,setOnClickListener
为注册函数。而A写的onClick
方法需要通过B规定的接口限制,传递给B。这就是回调的整个过程。
(PS:该回调是同步回调,调用B的setOnclickListener的时候没有开启线程,若B中的该方法是耗时操作,如下面的网络访问的例子,则需要开启线程实现异步回调)
大白话就是:A通过B规定的接口回调A自己写的函数(如onClick的具体实现)
再来举一个栗子,异步回调的网络访问请求。
代码:(网络请求具体实现类(B))
public class HttpRequest {
public interface HttpCallBack { // B规定的接口,可单独写到一个类中,这里为了方便写在同一个类中
void Success(String content); //接口函数里的参数是B要传递给A的数据
void Failure(String errorMsg);
}
//发起网络请求的具体实现
public void execute(String myurl, HttpCallBack callBack) {
try {
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(1000 * 3);
conn.setReadTimeout(2000 * 3);
int responseCode = conn.getResponseCode();
Thread.sleep(4000);//延时4秒,模拟耗时操作处理
if (responseCode == 200) {
callBack.Success("发送请求成功!!!!!");
} else {
callBack.Failure("发送请求失败,请求代码:" + responseCode);
}
} catch (InterruptedException e) {
e.printStackTrace();
}catch (IOException ex) {
ex.printStackTrace();
}
}
}
代码:(网络请求控制类(A))
public class SendRequest {
public void excute(){
final HttpRequest request = new HttpRequest();
final String url = "http://www.bilibili.com/";
new Thread(new Runnable() {//开启线程,异步处理,不需要等待B的返回结果,可直接往下执行代码
@Override
public void run() {
request.execute(url, new HttpRequest.HttpCallBack() {
@Override
public void Success(String content) {
System.out.print(content);
}
@Override
public void Failure(String errorMsg) {
System.out.print(errorMsg);
}
});
}
}).start();
System.out.print("开始玩咯→_→");
}
}
代码:(测试类)
public class MainTest {
public static void main(String[] args) {
SendRequest sendRequest = new SendRequest();
sendRequest.excute();
}
}
结果:
开始玩咯→_→
//4秒后再打印请求成功
发送请求成功!!!!!
A新开线程调用B的execute
方法发起网络请求,B通过接口将返回结果传递给A并回调A写的Success
或Failure
方法。
(PS:异步处理,不需要等待B的返回结果,可直接往下执行代码)