android回调函数
在我们进行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:定义工具类,调用回调函数
该工具类有以下属性:
- 类中有刚刚所定义的接口的对象
- 类的构造函数中,刚刚定义的接口作为參数
- 在须要调用接口函数的时候。调用接口函数
我们在这里实现一个工具类,该工具类实现从网络中获取数据,当获取数据成功的时候,调用接口中的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回调函数的更多相关文章
- android 回调函数二:应用实例
前言:如果对android回调的概念不明白的请看:android 回调函数一:基本概念 1.定义接口 package com.app.util; public interface ZYJCallBac ...
- android 回调函数一:基本概念
1.概念 客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数. 一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C ...
- android 回调函数的使用
// activity 之间方法调用的桥梁 public class ActivityCallBridge { static ActivityCallBridge mBridge; private O ...
- Android 回调函数的理解,实用简单(回调函数其实是为传递数据)
作者: 夏至,欢饮转载,也请保留这段申明 http://blog.csdn.net/u011418943/article/details/60139910 一般我们在不同的应用传递数据,比较方便的是用 ...
- android 回调函数使用简介
//1---定义回调函数 public interface GirdMenuStateListener { void onSuccess(); void onError(); } //2---使用的地 ...
- android 回调函数
http://blog.csdn.net/xiaanming/article/details/8703708 此为回调的java 实例 http://www.cnblogs.com/qingchen1 ...
- 十四、Android学习笔记_Android回调函数触发的几种方式 广播 静态对象
一.通过广播方式: 1.比如登录.假如下面这个方法是外界调用的,那么怎样在LoginActivity里面执行登录操作,成功之后在回调listener接口呢?如果是平常的类,可以通过构造函数将监听类对象 ...
- android之回调函数的意义
本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273) 看完这篇文后大家可以看看这个http://blog. ...
- JAVA回调函数ANDROID中典型的回调地方
在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序. 在JAVA里面我们使用接口的方式来实现函数的回调. 回调的通俗就是:程序 ...
随机推荐
- AtCoder Regular Contest 103 Problem D Robot Arms (构造)
题目链接 Problem D 给定$n$个坐标,然后让你构造一个长度为$m$的序列, 然后给每个坐标规定一个长度为$m$的序列,ULRD中的一个,意思是走的方向, 每次从原点出发按照这个序列方向,每 ...
- 鬼题Ghost [manacher]
本题目来自five20的周末考试题. Description 给定一个 0/1 序列,求其中满足 " ⺉ " 性质的子串个数. " ⺉ " 性质解释: &quo ...
- 有一种感动叫ACM(WJMZBMR在成都赛区开幕式上的讲话)
各位选手,各位教练,大家好,我是来自清华大学交叉信息学院的陈立杰,今天很荣幸站在这里代表全体参赛选手发言.对于我来说,这是我第一次正式参加ACM的比赛.不过我跟ACM之间的缘分,大概在很早的时候就已经 ...
- 循序渐进PYTHON3(十三) --4-- DJANGO之CSRF使用
用 django 有多久,跟 csrf 这个概念打交道就有久. 每次初始化一个项目时都能看到 django.middleware.csrf.CsrfViewMiddleware 这个中间件 每次在模板 ...
- 洛谷——P1994 有机物燃烧
P1994 有机物燃烧 题目背景 本来准备弄难点的,还是算了吧 题目描述 输入一种有机物,输出与氧气反应化学方程式中CO2和H2O的系数 输入输出格式 输入格式: 一行,一个字符串,表示有机物 输出格 ...
- POJ 3660 Cow Contest (dfs)
Cow Contest Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11129 Accepted: 6183 Desc ...
- SqlHelper——只因为在人群中多看了你一眼
对SQLHelper,还是有一点陌生的,但是大多数人都在使用,我就有一种想了解并使用的意愿,于是查了很多资料,发现一片不错的博客,放在下面,作为自己或读者使用的材料. 一.SqlHelper 出场 不 ...
- 【20181019T2】硬币【矩阵快速幂优化DP】
题面 [错解] 哎\(N \leq 50\)?双向搜索? 切了切-- 等下,好像要求方案数-- 好像搜不了 哎他给\(V_{i} | V_{i+1}\)干嘛? 肯定有用啊 为了体现条件的用处,我在搜下 ...
- CodeForces - 1004E Sonya and Ice Cream
题面在这里! 挺智障的一个二分...我还写了好久QWQ,退役算啦 题解见注释... /* 先对每个点记录 向子树外的最长路 和 向子树内最长路,然后二分. 二分的时候枚举链的LCA直接做就好啦. */ ...
- 【主席树】Gym - 101237A - MEX-Query
主席树里每个值的位置存当前该值出现的最右位置. 如果root[r]的前缀主席树中,某值最右位置大于等于l,说明该值出现在了l,r中. 所以主席树维护区间最小值,如果左半值域的最小值<l,则说明左 ...