java中怎么使用callback函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中怎么使用callback函数相关的知识,希望对你有一定的参考价值。

在很多场景,作为开发都会想到,在执行完毕一个任务的时候,能执行一个callback函数是多么好的事情。
现在模拟一下这个情景:
定义三个类。分别是主函数类。callback函数的接口类。业务处理类。在业务处理类中,处理完业务之后,执行一个callback函数。
[java] view plain copy
package comz;

public class Main
public static void main(String[] args)
new TestCallBack().compute(1000, new ComputeCallBack()

@Override
public void onComputeEnd()
System.out.println("end back!!!");


);


这是主函数类。new了一个业务处理类来处理逻辑,并在处理完毕之后,执行callback函数。
[java] view plain copy
package comz;

public class TestCallBack

public void compute(int n, ComputeCallBack callback)
for (int i = 0; i < n; i++)
System.out.println(i);

callback.onComputeEnd();


这是业务处理类。仅仅输出一些数字,然后执行回调函数。
[java] view plain copy
package comz;

public interface ComputeCallBack
public void onComputeEnd();

这是回调函数的接口。
--------------------------------------
运行上面的代码,就会在输出结束的时候调用在Main里面的callback函数,输出System.out.println("end back!!!");
--------------------------------------
这里的原理是:
在主类中,新建业务类的时候,传递进去的第二个参数是一个实现了回调接口的匿名类对象。
在业务类中,我们调用了这个对象的onComputeEnd方法。在执行onComputeEnd的时候,jvm会找到这个对象的函数实现并调用。于是就输出了end back!!!
参考技术A  场景一:

复制代码
Button button = (Button)this.findViewById(R.id.button);
button.setOnClickListener(new Button.OnClickListener()

//回调函数
@override
publicvoid onClick(View v)
buttonTextView.setText("按钮被点击了");

);
复制代码
  上面的代码给按钮加了一个事件监听器,这其实就是"回调"最常见的应用场景之一。我们自己不会显示地去调用onClick方法。用户触发了该按钮的点击事件后,它会由android系统来自动调用。

  场景二:

复制代码
@Override
publicvoid onCreate(Bundle saveInstanceState)
super.onCreate(saveInstanceState);
// You code...


@Override
publicvoid onResume()
super.onResume();
// You code...

复制代码
  上面的方法大家就更熟悉了,这是Android系统在Activity类中设置的回调函数,在Activity生命周期的不同阶段,Android系统会自动调用相应的方法(onCreate, onPause, onResume,onDestroy等等)

  以上是两个Android中用到"回调"的场景,他们的代码实现可能不同,但是思想上是相近的,都是"回调"思想的体现。下面,我们在Java中分别模拟这两个场景。

  首先模拟注册事件监听器。先写一个监听器接口

复制代码
package com.listener;

/**
* 点击监听器接口
* @author CodingMyWorld
*
*/
publicinterface MyOnClickListener
publicvoid onClick();

复制代码
  然后写一个我们自己的Button类

复制代码
package com.listener;

publicclass MyButton
private MyOnClickListener listener;

/**
* 设置具体点击监听器
* @param listener 点击监听器实现类
*/
publicvoid setOnClickListener(MyOnClickListener listener)
this.listener = listener;


/**
* 按钮被点击
*/
publicvoid doClick()
listener.onClick();


复制代码
  最后模拟Client端的注册监听器和触发点击操作。

复制代码
package com.listener;

publicclass Client
publicstaticvoid main(String[] args)
MyButton button =new MyButton();
//注册监听器
button.setOnClickListener(new MyOnClickListener()

@Override
publicvoid onClick()
System.out.println("按钮被点击了");



);
//模拟用户点击
button.doClick();


复制代码
  以上就是"回调"思想在Java中事件监听的运用,我们再模拟第二个场景,"回调"在activity生命周期方法调用的体现。由于比较简单,我就不多做解释了,大家直接看代码。

复制代码
package com.activity;

publicabstractclass Activity
protectedvoid onCreate()
System.out.println("创建准备~~~~~~~");


protectedvoid onDestroy()
System.out.println("销毁准备~~~~~~~~");


复制代码
复制代码
package com.activity;

publicclass ConcreteActivity extends Activity
@Override
protectedvoid onCreate()
super.onCreate();
System.out.println("创建中!!!");


@Override
protectedvoid onDestroy()
super.onDestroy();
System.out.println("销毁中!!!");


复制代码
复制代码
package com.activity;

publicclass Client
publicstaticvoid main(String[] args)
Activity activity =new ConcreteActivity();
activity.onCreate();
activity.onDestroy();
参考技术B 1、定义连接工厂使用
2、定义回调函数的接口
3、定义使用回调函数的测试类

以上是关于java中怎么使用callback函数的主要内容,如果未能解决你的问题,请参考以下文章

请求方法

Node.js 使用Nimble实现串行流程控制

node.js初步了解——慕课网(回调,作用域,上下文)

在JavaScript中构建mergesort时的无限循环

Java 回调函数callback 用法

画布中的图像未正确保存