版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/46837287

在我们进行android开发的时候,经常遇到一些回调函数,其中,我们最常用的回调就是,当我们对一个组件设置监听的时候,其实就相对于设置的回调函数。例如:

Button btn = (Button)findViewById(R.id.btn);btn.setOnClickListener(new Button.OnClickListener(){//创建监听    public void onClick(View v) {    String strTmp = "点击Button01";    Ev1.setText(strTmp);    }    });

首先我们了解一下什么叫做回调函数。假设我们有两个类,分别为A和B,其中A需要调用B中的函数,但是B也需要调用A中的函数C,则C就是回调函数,这样看来,就相当于实现一个双向调用。

我们在进行android开发的时候,经常使用一些开源社区贡献的一些有关于网络获取数据或者是下载图片的开源包,这些包里面用到了很多回调函数,现在我们就是用一个获取网络数据的例子,来看一看如何定义自己的回调函数。

首先需要声明的是,回调函数是试用接口实现的。我们一步一步来实现回调函数。

1:定义一个接口,其中定义一些需要用到的回调函数。

名称:DownInterface.java

package interfaces;public interface DownInterface {//需要用到的回调函数public void onDownloadSuccess(String result);
}

2:定义工具类,调用回调函数

该工具类有以下属性:

  1. 类中有刚刚所定义的接口的对象
  2. 类的构造函数中,刚刚定义的接口作为参数
  3. 在需要调用接口函数的时候,调用接口函数

我们在这里实现一个工具类,该工具类实现从网络中获取数据,当获取数据成功的时候,调用接口中的onDownloadSuccess()函数,将数据传送给调用该类的对象。

下面我们定义这个工具类:

DownLoadEventNotifier .java

package interfaces;import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;import com.sdu.utils.StaticValue;import android.os.Handler;
import android.os.Message;
import android.util.Log;public class DownLoadEventNotifier {private DownInterface dif;//处理数据接收完成之后,调用接口函数private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubif(msg.what == 0){String back = (String)msg.obj;dif.onDownloadSuccess(back);}}};public DownLoadEventNotifier(DownInterface dif){this.dif = dif;}//开始进行下载public void start(String req,String url){new Thread(new DealThread(req, url)).start();}class DealThread implements Runnable{private String req;private String url;public DealThread(String req,String url){this.req = req;this.url = url;}@Overridepublic void run() {// TODO Auto-generated method stubdeal();}private void deal(){Log.e("req",req); //获取响应内容List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>();  params.add(new BasicNameValuePair("REQUEST", req));try {//http://jiduoduo.duapp.com//http://211.87.227.124/study.phpHttpPost postMethod = new HttpPost(StaticValue.URL+url);postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //将参数填入POST Entity中Log.e("url",StaticValue.URL+url); //获取响应内容HttpResponse response = new DefaultHttpClient().execute(postMethod); //执行POST方法String back = EntityUtils.toString(response.getEntity(), "utf-8");Log.e("result", "result = " + back); //获取响应内容Message msg = Message.obtain();msg.obj = back;msg.what = 0;handler.sendMessage(msg);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

3:使用该工具类

下面我们看一下,如何使用该工具类,在A类中,假设有一个Button,点击该按钮之后,获取网络中的数据,当网络中的数据获取成功之后,打印出该数据。

下面我们看一下调用的代码:

package com.sdu.activities;import interfaces.DownInterface;
import interfaces.DownLoadEventNotifier;import com.sdu.androidmarket.R;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;public class TestActivity extends Activity{private Button btn;private DownLoadEventNotifier den;@Overrideprotected void onCreate(Bundle savedInstanceState) {btn = (Button)findViewById(R.id.button1);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {den = new DownLoadEventNotifier(new DownInterface() {@Overridepublic void onDownloadSuccess(String result) {// TODO Auto-generated method stubToast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();}});}});super.onCreate(savedInstanceState);}}

看到了吧,是不是感觉很熟悉?我们经常使用的下载工具包,里面有onLoading(),onSuccess(),onStop()等这些函数其实都是回调函数。其实我们使用回调函数也能定义自己的下载工具类,等过几天我定义一个这样的工具类,试验一下。大家可以试一下如何自己定义一个回调函数。

android回调函数相关推荐

  1. android 回调函数二:应用实例

    前言:如果对android回调的概念不明白的请看:android 回调函数一:基本概念 1.定义接口 package com.app.util;public interface ZYJCallBack ...

  2. android 回调函数一:基本概念

    1.概念 客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数. 一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C ...

  3. Android回调函数理解

    Android回调函数理解,比如我用一个activity去做显示下载进度的一个进度条,但是下载是另外一个B类来做的,这个时候我Activity获取下载的进度就可以提供一个回调接口,然后让下载类来回调就 ...

  4. Android回调函数机制那点事

    引言 在Android的学习过程中经常会听到或者见到"回调"这个词,那么什么是回调呢?所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是 ...

  5. android final函数,Android 回调函数 解析问题

    大家先看看我的代码,Okhttp访问接口返回json 然后 解析回调的例子 public static void get(String url, final CallBack callback) { ...

  6. Android和Java中的回调函数

    在 Android 的学习过程中遇到了回调函数,经过一段时间的理解,将自己的收获整理如下,希望对迫切希望了解这方面知识的同学有所启发. 回调函数的理解如下: 在A类中定义了一个方法,这个方法中用到了一 ...

  7. 【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )

    文章目录 I . FFMPEG 播放视频流程 II . OpenSLES 播放音频流程 III . OpenSLES 播放参考 Google 官方示例 IV . OpenSL ES 播放代码 ( 详细 ...

  8. 【Android 高性能音频】AAudio 音频流 数据回调细节 ( 数据回调函数优先级 | 数据回调函数 | 采样率 | 采样数 | 缓冲区调整 | 线程不安全 )

    文章目录 I . 数据回调函数优先级 II . 数据回调函数 相关内容 III . 采样率 处理细节 IV . 数据回调函数 每次 采样个数 numFrames V . 数据回调函数 缓冲区 ( AA ...

  9. 来自Android客户端什么意思,如何通过回调函数中的Node.js来自Android客户端

    我想从插座Android客户端将数据发送到服务器的Node.js .. 在服务器端做了什么香港专业教育学院:如何通过回调函数中的Node.js来自Android客户端 socket.on('new u ...

最新文章

  1. QIIME 2教程. 31名词Glossary(2021.2)
  2. 1150 Travelling Salesman Problem (25 分)【难度: 难 / 知识点: 图 模拟 未完成】
  3. SQL 盲注GET /POST、布尔型,延时型Python脚本
  4. streaming接mysql数据库_[Spark streaming举例]-- 实时统计并且存储到mysql数据库中
  5. 《R语言数据挖掘:实用项目解析》——1.11 apply原理
  6. 如何让你的数据库定时自动备份(2000SQL)
  7. B站又出事了,遭几大平台联合谴责
  8. HDU 2604 Queuing( 递推关系 + 矩阵快速幂 )
  9. mac本 安装淘宝镜像
  10. 【CGAL】提取中心线
  11. kappa一致性检验教程_Kappa一致性检验:两种诊断方法的结果是否一致?
  12. 树莓派组网 ad-hoc模式
  13. IDEA中修改html页面后在浏览器不生效的解决方法
  14. 读懂这三个关键词,就明白迅雷链为什么受开发者欢迎
  15. iframe内嵌标签
  16. C# 抓图服务的实现
  17. 计算机网络第六、七版答案
  18. 域名注册,选择注册商的安全重要性
  19. 笼统的前端:知识图谱、各分支领域技术要点和推荐工具
  20. C++ 测试驱动开发

热门文章

  1. GNU make manual 翻译( 一百二十一)
  2. 究竟什么是POJO?(转载)
  3. arcgis的server不可用
  4. E-learning的现状与未来
  5. Silverlight学习笔记之使用TranslateTransform控制对象位置
  6. 在虚拟机中的Nginx的安装
  7. 五、任意输入10个int类型数据,排序输出,再找出素数
  8. Springboot、Mybatis 事务示例
  9. 运行时权限框架YPermission开源
  10. 块存储、文件存储、对象存储这三者和分布式文件存储系统的本质区别