写作原因:Android回调机制是Android开发者绕不开的一个点,对于它的掌握学习十分重要。本文由于作者水平有限可能存在纰漏,对于回调机制的学习掌握仍在途中,以后会推出更多的相关文章。


简介

接口回调是Android中一种常用的机制,如Button点击事件就是接口回调的具体实现。Fragment与Activity之间的通信机制也是基于接口回调实现,感兴趣的可以阅读博主上篇关于Fragment通信的文章(基于Google官方文档):Fragment间的通信。对于接口回调,作为初学者,个人有一下的一点认识:我们可以把接口看作是一个呼叫端口,是在某个功能类(发送方)完成自身功能过程中触发某些动作时通过接口中的某一个方法呼叫接口,然后接口将这种呼叫传至实现该接口的类(接收处理方)中,该类通过实现回调方法对该呼叫作出反馈。下面是Wikipedia上面关于回调机制的定义,有兴趣可以看看。

In computer programming, a callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time. The invocation may be immediate as in a synchronous callback, or it might happen at a later time as in an asynchronous callback. In all cases, the intention is to specify a function or subroutine as an entity that is, depending on the language, more or less similar to a variable.

实现

实现代码是最好的学习方式,下面博主通过封装一个简单的Dialog来讲解接口回调的具体用法。平常使用Dialog时如果按照标准写法来有时会显得很繁琐,博主因为特定需要将其封装成一个只有message和“确定”,“取消”按钮点击事件的工具。下面我将按照步骤一步步实现:

定义接口

在简介中已经说过,接口是一个呼叫端口,是通信的中介。内部的方法类比为不同请求。的本例中的接口是在我们点击Positive Button和Negative Button时被呼叫的。所以定义一下的接口:

public interface onButtonClick{        public void OnPositive();        public void OnNegative();    }

上面的接口中有两个方法,分别在点击Positive Button和Negative Button时回调

实现接口

这包括两个部分,一个是在功能类(发送方)向接口发出呼叫时实现回调:
先创建回调对象mCallBack:
private onButtonClick mButtonClickCallBack;
然后在触发某个动作时(当点击Dialog上的按钮时)发出回调(呼叫接口):

builderSec.setPositiveButton("确定", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                mButtonClickCallBack.OnPositive();            }        });        builderSec.setNegativeButton("取消", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                mButtonClickCallBack.OnNegative();            }        });

在另一个类(接收处理方)中实现回调方法对该呼叫作出反馈:
先实现该接口,可以在功能类中定义以下方法:

public void setOnButtonClick(onButtonClick mNegativeCallBack) {        this.mButtonClickCallBack = mNegativeCallBack;    }
MyDialog deleteDialog = new MyDialog(getActivity(),"RTGBrowser","是否删除当前历史记录?");                deleteDialog.setOnButtonClick(new MyDialog.onButtonClick() {                    @Override                    public void OnPositive() {                        //TODO:在这里实现点击Positive按钮的逻辑;                    }                    @Override                    public void OnNegative() {                        //TODO:在这里实现点击Negative按钮的逻辑;                    }                });

这样就通过接口回调实现对一个Dialog进行封装,下面贴出完整的代码:

源码

MyDialog.class

package com.example.vincebarry.exam.function;import android.content.Context;import android.content.DialogInterface;import android.support.v7.app.AlertDialog;/** * Created by VinceBarry on 2016/5/2. * 那现在一起来总结一下基本的回调是如何实现的,首先创建一个接口,这个接口用于你在某个情景下执行相应的操作。 * 接着创建一个功能类,比如这个类可以显示一个对话框、可以滑动菜单、可以下载数据等等。 * 然后,在这个类里面声明回调接口的对象,之后在这个类里面创建在某个情景下需要执行的方法,而且在这个方法里面为声明的接口对象赋值。 * 最后在其他的类中使用这个功能类就可以了。所以说,最少也是需要三个类共同来完成这个回调机制。 */public class MyDialog {    private onButtonClick mButtonClickCallBack;    private Context context;    private String title;    private String message;    AlertDialog.Builder builderSec;    public interface onButtonClick{        public void OnPositive();        public void OnNegative();    }    public MyDialog(Context context,String title,String message){        this.context = context;        this.title = title;        this.message = message;        builderSec = new AlertDialog.Builder(context);        builderSec.setTitle(title);        builderSec.setMessage(message);        builderSec.setPositiveButton("确定", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                mButtonClickCallBack.OnPositive();            }        });        builderSec.setNegativeButton("取消", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                mButtonClickCallBack.OnNegative();            }        });        AlertDialog dialogSec = builderSec.show();    }    public void setOnButtonClick(onButtonClick mNegativeCallBack) {        this.mButtonClickCallBack = mNegativeCallBack;    }}

MainActivity.class

MyDialog deleteDialog = new MyDialog(getActivity(),"RTGBrowser","是否删除当前历史记录?");
deleteDialog.setOnButtonClick(new MyDialog.onButtonClick() {
@Override
public void OnPositive() {
DataSupport.delete(TableHistoryLocal.class,positionInDb);
queryAndTrans();
roadData();
}
@Override
public void OnNegative() {
//donothing.
}
});

水平不足,存在纰漏或错误请指教!!

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. python list.sort()根据多个关键字排序的方法实现
  3. 19_利用android提供的HanziToPinyin工具类实现汉字与拼接的转换
  4. Kotlin实战(三): 动手撸个玩Android客户端
  5. 访问接口,ios可以Android却不可以要么超时,要么数据异常
  6. Android中实现全屏、无标题栏的两种办法(另附Android系统自带样式
  7. Android实现截图分享qq 微信功能
  8. 13-5-16 Android自定义空间实现wifi信号强度
  9. Android(安卓)创建与解析XML(一)—— 概述

随机推荐

  1. 解决Warning:android-apt plugin is inco
  2. Android(安卓)事件触发机制
  3. android中将中文以粗体显示
  4. androidmanifest.xml解析
  5. android的singleInstance启动模式及方法
  6. 友盟推送android 8.0系统不显示推送消息
  7. Android2.2 API 中文文档系列(2) —— Edit
  8. android edittext 设置行距不影响光标高
  9. Android(安卓)TabLayout 浅显总结
  10. Android(安卓)Wifi子系统源代码View