android回调函数

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/46837287 在我们进行android开发的时候,经常遇到一些回调函数,其中,我们最常用的回调就是,当我们对一个组件设置监听的时候,其实就相对于设置的回调函数。
版权声明:您好,转载请留下本人博客的地址,谢谢 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(){

        @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 FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )(二)
【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )(二)
297 0
|
存储 编解码 Java
【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )(一)
【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )(一)
287 0
|
安全 API Android开发
【Android 高性能音频】AAudio 音频流 数据回调细节 ( 数据回调函数优先级 | 数据回调函数 | 采样率 | 采样数 | 缓冲区调整 | 线程不安全 )
【Android 高性能音频】AAudio 音频流 数据回调细节 ( 数据回调函数优先级 | 数据回调函数 | 采样率 | 采样数 | 缓冲区调整 | 线程不安全 )
372 0
|
机器学习/深度学习 Android开发 开发者
【Android 高性能音频】AAudio 音频流 PCM 采样 的 采样 缓冲 播放 的 连续机制 ( 数据回调机制 | 数据回调函数指针 | 实现数据回调函数 | 设置数据回调函数 )
【Android 高性能音频】AAudio 音频流 PCM 采样 的 采样 缓冲 播放 的 连续机制 ( 数据回调机制 | 数据回调函数指针 | 实现数据回调函数 | 设置数据回调函数 )
413 0
【Android 高性能音频】AAudio 音频流 PCM 采样 的 采样 缓冲 播放 的 连续机制 ( 数据回调机制 | 数据回调函数指针 | 实现数据回调函数 | 设置数据回调函数 )
|
Android开发
android 回调函数一:基本概念
1、概念 客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。 一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。
974 0
|
Android开发
android 回调函数二:应用实例
前言:如果对android回调的概念不明白的请看:android 回调函数一:基本概念 1、定义接口 package com.app.util; public interface ZYJCallBack { public void dataResult( String re...
848 0
|
4天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
27天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
1天前
|
数据库 Android开发 开发者
安卓应用开发:构建高效用户界面的策略
【4月更文挑战第24天】 在竞争激烈的移动应用市场中,一个流畅且响应迅速的用户界面(UI)是吸引和保留用户的关键。针对安卓平台,开发者面临着多样化的设备和系统版本,这增加了构建高效UI的复杂性。本文将深入分析安卓平台上构建高效用户界面的最佳实践,包括布局优化、资源管理和绘制性能的考量,旨在为开发者提供实用的技术指南,帮助他们创建更流畅的用户体验。
|
18天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。