在我们进行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(){ @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
if(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;
} @Override
public void run() {
// TODO Auto-generated method stub
deal();
} 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.php
HttpPost 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 block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.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; @Override
protected void onCreate(Bundle savedInstanceState) { btn = (Button)findViewById(R.id.button1); btn.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
den = new DownLoadEventNotifier(new DownInterface() { @Override
public void onDownloadSuccess(String result) {
// TODO Auto-generated method stub
Toast.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 ZYJCallBac ...

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

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

  3. android 回调函数的使用

    // activity 之间方法调用的桥梁 public class ActivityCallBridge { static ActivityCallBridge mBridge; private O ...

  4. Android 回调函数的理解,实用简单(回调函数其实是为传递数据)

    作者: 夏至,欢饮转载,也请保留这段申明 http://blog.csdn.net/u011418943/article/details/60139910 一般我们在不同的应用传递数据,比较方便的是用 ...

  5. android 回调函数使用简介

    //1---定义回调函数 public interface GirdMenuStateListener { void onSuccess(); void onError(); } //2---使用的地 ...

  6. android 回调函数

    http://blog.csdn.net/xiaanming/article/details/8703708 此为回调的java 实例 http://www.cnblogs.com/qingchen1 ...

  7. 十四、Android学习笔记_Android回调函数触发的几种方式 广播 静态对象

    一.通过广播方式: 1.比如登录.假如下面这个方法是外界调用的,那么怎样在LoginActivity里面执行登录操作,成功之后在回调listener接口呢?如果是平常的类,可以通过构造函数将监听类对象 ...

  8. android之回调函数的意义

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273) 看完这篇文后大家可以看看这个http://blog. ...

  9. JAVA回调函数ANDROID中典型的回调地方

    在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序. 在JAVA里面我们使用接口的方式来实现函数的回调. 回调的通俗就是:程序 ...

随机推荐

  1. Linux操作命令(七)

    本次实验将介绍 Linux 命令中 cut.paste 和 tr 命令的用法. cut paste tr 1.cut cut命令是一个将文本按列进行切分的小工具,他可以指定分隔每列的定界符. 如果一行 ...

  2. 洛谷——P1890 gcd区间

    P1890 gcd区间 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n ...

  3. POJ 3660 Cow Contest (dfs)

    Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11129   Accepted: 6183 Desc ...

  4. Telnet操作memcached

    telnet登录 #telnet <ip> [root@c1 ~]# telnet Trying 127.0.0.1... Connected to 127.0.0.1. Escape c ...

  5. SQLSEVER 中的那些键和约束

    SQL Server中有五种约束类型,分别是 PRIMARY KEY约束.FOREIGN KEY约束.UNIQUE约束.DEFAULT约束.和CHECK约束.查看或者创建约束都要使用到 Microso ...

  6. BZOJ 1098 [POI2007]办公楼biu(反向图bfs+并查集优化)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1098 [题目大意] 现在有一张图,要求将这张图的点划分为尽量多的分组,对于不同分组的两 ...

  7. 【模拟退火】poj2420 A Star not a Tree?

    题意:求平面上一个点,使其到给定的n个点的距离和最小,即费马点. 模拟退火的思想是随机移动,然后100%接受更优解,以一定概率接受更劣解.移动的过程中温度缓慢降低,接受更劣解的概率降低. 在网上看到的 ...

  8. 将int型数值拆分成4字节

  9. 添加HP消息队列

    Date: 20140210 Auth: Jin 两台服务器 120 HTTPSQS 236 HTTPPROXY 1.add host $ jump 120 #vim /etc/hosts 192.1 ...

  10. 1前端案例-tag标签+随机位置

    tag标签随机位置+js数组随机+js添加一段html代码段 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN ...