Android-Java中的回调函数
来源:互联网 发布:平野美宇萝莉 知乎 编辑:程序博客网 时间:2024/06/05 19:15
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的返回结果,可直接往下执行代码)
0 0
- Android和Java中的回调函数
- Android-Java中的回调函数
- Android中的回调函数
- JAVA中的回调函数
- java中的回调函数
- JAVA中的回调函数
- java中的回调函数
- java中的回调函数
- java中的回调函数
- java中的回调函数
- java中的回调函数
- java中的回调函数
- Java/Android中的函数调用&回调函数&自定义回调函数
- Java/Android中的函数调用&回调函数&自定义回调函数
- Java/Android中的函数调用&回调函数&自定义回调函数
- Java/Android中的函数调用&回调函数&自定义回调函数
- Java/Android中的函数调用&回调函数&自定义回调函数
- Android学习笔记之java中的回调函数
- 一道 JS 面试题引发的思考
- 2、Browse the filesystem连接打不开
- 干货!老司机工作中用到的自定义控件,总有一个适合你的(一)
- android-- Android动画之萌萌哒蜡烛吹蜡烛动画
- 12.7 bzoj1192 [HNOI2006]鬼谷子的钱袋
- Android-Java中的回调函数
- 第三方库
- MATLAB中文件的读写和数据的导入导出【转】
- 特征选择方法
- CentOS 7 网络配置
- win7 64 安装mysql-python:_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h': N
- 图解android开发在界面上显示图片
- MTK 影像工具分析介绍
- oracle 判断今天是星期几