Android-Java中的回调函数

àì夳堔傛蜴生んèń 2022-07-14 10:50 306阅读 0赞

Android和Java中经常遇到有接口回调的代码,之前用的时候也不是太清楚,什么情况下适合用,具体怎么用,脑子中还没有较为清晰的理解。网上也是一大堆各种例子讲解,鱼龙混杂,现对回调函数用自己的理解做个整理,加深自己的印象,不足之处,日后再行补充。

首先拿最常见的Button的点击事件举例来说:

代码:

  1. public class MainActivity extends AppCompatActivity {
  2. private Button bt;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. bt = (Button) findViewById(R.id.bt);
  8. bt.setOnClickListener(new View.OnClickListener() {
  9. //B规定的接口
  10. @Override
  11. public void onClick(View view) {
  12. //回调函数
  13. bt.setText("被点击了→_→")
  14. }
  15. });
  16. }
  17. }

View的源码中有接口如下:

  1. public static interface OnClickListener {
  2. void onClick(android.view.View view);
  3. }

我(A),系统代码(B)

A调用B的setOnClickListener方法,B再回调A写的方法onClickonClick为回调函数,setOnClickListener为注册函数。而A写的onClick方法需要通过B规定的接口限制,传递给B。这就是回调的整个过程。
(PS:该回调是同步回调,调用B的setOnclickListener的时候没有开启线程,若B中的该方法是耗时操作,如下面的网络访问的例子,则需要开启线程实现异步回调)

大白话就是:A通过B规定的接口回调A自己写的函数(如onClick的具体实现)

再来举一个栗子,异步回调的网络访问请求。

代码:(网络请求具体实现类(B))

  1. public class HttpRequest {
  2. public interface HttpCallBack { // B规定的接口,可单独写到一个类中,这里为了方便写在同一个类中
  3. void Success(String content); //接口函数里的参数是B要传递给A的数据
  4. void Failure(String errorMsg);
  5. }
  6. //发起网络请求的具体实现
  7. public void execute(String myurl, HttpCallBack callBack) {
  8. try {
  9. URL url = new URL(myurl);
  10. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  11. conn.setConnectTimeout(1000 * 3);
  12. conn.setReadTimeout(2000 * 3);
  13. int responseCode = conn.getResponseCode();
  14. Thread.sleep(4000);//延时4秒,模拟耗时操作处理
  15. if (responseCode == 200) {
  16. callBack.Success("发送请求成功!!!!!");
  17. } else {
  18. callBack.Failure("发送请求失败,请求代码:" + responseCode);
  19. }
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }catch (IOException ex) {
  23. ex.printStackTrace();
  24. }
  25. }
  26. }

代码:(网络请求控制类(A))

  1. public class SendRequest {
  2. public void excute(){
  3. final HttpRequest request = new HttpRequest();
  4. final String url = "http://www.bilibili.com/";
  5. new Thread(new Runnable() {
  6. //开启线程,异步处理,不需要等待B的返回结果,可直接往下执行代码
  7. @Override
  8. public void run() {
  9. request.execute(url, new HttpRequest.HttpCallBack() {
  10. @Override
  11. public void Success(String content) {
  12. System.out.print(content);
  13. }
  14. @Override
  15. public void Failure(String errorMsg) {
  16. System.out.print(errorMsg);
  17. }
  18. });
  19. }
  20. }).start();
  21. System.out.print("开始玩咯→_→");
  22. }
  23. }

代码:(测试类)

  1. public class MainTest {
  2. public static void main(String[] args) {
  3. SendRequest sendRequest = new SendRequest();
  4. sendRequest.excute();
  5. }
  6. }

结果:

  1. 开始玩咯→_
  2. //4秒后再打印请求成功
  3. 发送请求成功!!!!!

A新开线程调用B的execute方法发起网络请求,B通过接口将返回结果传递给A并回调A写的SuccessFailure方法。
(PS:异步处理,不需要等待B的返回结果,可直接往下执行代码)

发表评论

表情:
评论列表 (有 0 条评论,306人围观)

还没有评论,来说两句吧...

相关阅读

    相关 js函数

    一个函数被作为参数传递给另一个函数(在这里我们把另一个函数叫做otherFucntion),回调函数在otherFunction中被调用 回调函数原理:     

    相关 js函数

    1:回调函数: 定义了,但没有调,但最终执行了 2: dom事件回调函数 定时器回调函数 ajax请求回调函数 生命周期回调函数 documen

    相关 java函数

    CALLBACK,即回调函数,是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调

    相关 函数

    回调函数是一种函数指针的使用方式。 stdcall和cdecl的区别:这个问题涉及到函数调用的汇编知识,暂只需记住stdcall和cdecl的参数压栈顺序是相同的,参

    相关 函数

    作为JS的核心,回调函数和异步执行是紧密相关的,也是必须跨过去的一道个门槛。 那么究竟什么是回调函数(Callback),其实回调函数并不复杂,明白两个重点即可: 1. 函

    相关 函数

    一、定义 什么是回调函数?它首先是一个函数,这是肯定的,我举个例子:有两个函数A和B,首先应用程序将A的地址告诉B,这称之为注册回调函数,B在收到外部某个命令的时候,可以根据

    相关 函数

    回调与回调函数 回调 回调函数 回调   回调指的是某函数在执行的时候,由于某些原因,该函数被迫中止执行,交出当前线程的使用权,当前线程转而执行其它函