Android实战之接口回调

由于自己以前也困于抽象、接口等“吓人”的东西,网上又缺乏在项目中实战运用的讲解,下面我就斗胆把自己的理解和大家交流一下下。

本人也算是自学“成才”,呵呵,大学时虽然学的计算机,但是对软件开发却并不感兴趣。毕业后看同学们或培训Android或培训IOS 4个月后都很快找到了不错的工作,令我感到很诧异,也很羡煞!于是我做出了人生中重要的一个决定,开始学习Android,由于本人比较穷,所以选择自学。学习的过程实为不易,从刚开始的一无所知时的苦苦挣扎,到学有所得后的应对有策,全靠自己的勤学好问。

学Java的人应该都知道面向对象的三大特征:封装、继承、多态,有三分之二就涉及到了抽象(继承和多态),由此可以看出抽象的重要性。抽象这个词听起来很抽象,学起来也很抽象,而接口是特殊的抽象类(类里面的方法全部是抽象方法),那就更抽象了。我一直知道抽象的存在,但是一直不知道怎么用它和它有什么好处,也不知道该如何问别人。于是就这么写着代码做着项目,直到有一次。有人要问了,不会运用抽象、接口之类的东西不是也能写项目吗?我要说的是代码的质量不同,要不然砖家们为什么要发明它呀?!

在做项目的过程中,有一次和做服务器的同事讨论点问题,他看了一下我的代码,然后发现了比较严重的问题,那是请求网络操作。我引用的是AsyncHttpClient.jar,每次网络请求都:

RequestParams params = new RequestParams();

new AsyncHttpClient( ).post(requestUrl, params,new AsyncHttpResponseHandler() {

public void onSuccess(int statusCode, Header[] headers,byte[] responseBody) {}

public void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable error) {}

}

所以在一个Activity活Fragment中都要new AsyncHttpClient(),好多次,这样也会产生许多重复代码,以及条理不清,不符合单一职责原则。于是他帮我把网络请求操作单独出来一个类,再通过接口回调和Fragment或Activity交互。我感觉这样非常棒,自己对接口的理解也豁然开朗:

public  class NetRequest  {

private NetRequestIterface netRequestIterface;

private Context context;

public NetRequest( NetRequestIterface netRequestIterface,Context context) {

this.netRequestIterface= netRequestIterface;

this.context=context;

}

RequestParams params = new RequestParams();

if (null!=map&&!map.isEmpty())

for (String key : map.keySet()) {

params.put(key, map.get(key));

}

new AsyncHttpClient( ).post(requestUrl, params,new AsyncHttpResponseHandler() {

public void onSuccess(int statusCode, Header[] headers,byte[] responseBody) {

//这里是把网络异步解析出来的result传递到子类,requestUrl是一个标志判断是哪一个请求。子类实现changeView()

netRequestIterface.changeView(result, requestUrl);

}

public void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable error) {}

}

}

这是我写的一个网络操作接口回调的一个小Demo,代码下载地址:http://download.csdn.net/detail/gaolei1201/8936209

接口回调的条件就是一个接口,两个类,两个类之间互相操作,它符合JAVA设计模式六大原则之依赖倒置原则。 关于设计模式的六大原则可参考我的上篇博客:http://blog.csdn.net/gaolei1201/article/details/47082783。关于接口回调的详细内容可以参考:http://www.2cto.com/kf/201412/365788.html

下面再讲一个例子说明,Fragment是项目中常用的组件,但是他们之间交互你是怎么实现的呢?不得其领的人应该做起来是比较困难的,像以前的我。如FragmentA想要改变FragmentB的UI,你首先可能会想到在FragmentB中写一个方法如changeFragmentUI()来改变FragmentB的UI,1、你首先想到的是new FragmentB().changeFragmentUI(),但是你试过后发现是不行的报:NullPointerException。这是因为你有重新new了一个FragmentB,而需要改变的组件初始化是在原来的FragmentB。2、把changeFragmentUI设为static,那就可以FragmentB.chaneFragmentUI()。这样虽然不会报空指针异常,但是static方法里面的变量也就必须全部是static,也就是你要改变UI的组件都要声明是static,想想,如果有太多的static那样肯定是不好的。这时如果会用接口回调那么就能解决你所有的烦恼啦,下面举例实现两个Fragment之间交互来改变彼此UI的例子。

如下LeftFragment代码:

public class LeftFragment extends Fragment implements OnFragmentChangeListener {

private TextView show_change_text;

private Button change_activity_bt;

public static OnFragmentChangeListener onFragmentChangeListener;

public static void setOnFragmentChangeListener(OnFragmentChangeListener onFragmentChangeListener){

RightFragment.onFragmentChangeListener=onFragmentChangeListener;

}

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

super.onCreateView(inflater, container, savedInstanceState);

View view = inflater.inflate(R.layout.right_fragment, null);

change_activity_bt = (Button) view

.findViewById(R.id.change_activity_bt);

show_change_text = (TextView) view.findViewById(R.id.show_change_text);

/* new RightFragment().setOnFragmentChangeListener(this); 这样set是不行的,因为这样又重新创造了一个MainActivity,和原来初始化的那个不是
   一个,回报空指针,因为activity的listener没有被set(实例化)。所以应该这样  MainActivity.setOnFragmentChangeListener(this);*/

RightFragment.setOnFragmentChangeListener(this);

change_activity_bt.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

// TODO Auto-generated method stub

//在这里执行接口方法

onFragmentChangeListener.onFragmentChange();

}

});

return view;

}

@Override

public void onFragmentChange() {

// 在子类中实现接口的方法

show_change_text.setText("I am LeftFragment,and I have changed");

}

}

如下是RightFragment代码,和LeftFrgment几乎一样,因为它们的逻辑一样:

public class RightFragment extends Fragment implements OnFragmentChangeListener {

private TextView show_change_text;

private Button change_activity_bt;

public static OnFragmentChangeListener onFragmentChangeListener;

public static void setOnFragmentChangeListener(OnFragmentChangeListener onFragmentChangeListener){

RightFragment.onFragmentChangeListener=onFragmentChangeListener;

}

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

super.onCreateView(inflater, container, savedInstanceState);

View view = inflater.inflate(R.layout.right_fragment, null);

change_activity_bt = (Button) view

.findViewById(R.id.change_activity_bt);

show_change_text = (TextView) view.findViewById(R.id.show_change_text);

/* new LeftFragment().setOnFragmentChangeListener(this); 这样set是不行的,因为这样又重新创造了一个MainActivity,和原来初始化的那个不是

一个,回报空指针,因为activity的listener没有被set(实例化)。所以应该这样  MainActivity.setOnFragmentChangeListener(this);*/

LeftFragment.setOnFragmentChangeListener(this);

change_activity_bt.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

// TODO Auto-generated method stub

//在这里执行接口方法

onFragmentChangeListener.onFragmentChange();

}

});

return view;

}

@Override

public void onFragmentChange() {

// 在子类中实现接口的方法

show_change_text.setText("I am RightFragment,and I have changed");

}

这是Demo下载地址:http://download.csdn.net/detail/gaolei1201/8936215

这不是对大牛说的。抽象、接口确实比较抽象这需要自己不断学习、总结,更重要的是在项目中去运用它,之后,你就会理解它的作用,发现它的优点,Oh Yeah!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 07:00:07

Android实战之接口回调的相关文章

谈谈-Android中的接口回调技术

Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James对Android接口回调技术的理解(结合前人的知识和自己的实践). 使用一个比喻很形象地说明:客户端有个疑问打电话请教服务端,但服务端无法现场给出解答,相互之间约定:服务端一旦有答案,使用电话的方式反馈给客户端. 以上有三个主体:客户端.服务端和接口(方式). 接口回调的原理框图说明: Demo界面

Android中的接口回调技术

Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James对Android接口回调技术的理解(结合前人的知识和自己的实践). 使用一个比喻很形象地说明:客户端有个疑问打电话请教服务端,但服务端无法现场给出解答,相互之间约定:服务端一旦有答案,使用电话的方式反馈给客户端. 以上有三个主体:客户端.服务端和接口(方式). 接口回调的原理框图说明: Demo界面

Android 中的接口回调

http://blog.csdn.net/wangjinyu501/article/details/22052187 在Android中到处可见接口回调机制,尤其是UI事件处理方面.举一个最常见的例子button点击事件,button有一个点击方法onClick(),我们知道onclick()是一个回调方法,当用户点击button就执行这个方法.在源码中是这样定义的: //这个是View的一个回调接口 /** * Interface definition for a callback to be

Java接口回调机制

一.前言 最近在看android Fragment与Activity进行数据传递的部分,看到了接口回调的内容,今天来总结一下. 二.回调的含义和用途 1.什么是回调? 一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为三类同步调用.异步调用和回调.同步调用是一种阻塞式调用,即在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行.异步调用是一种类似消息或事件的机制解决了同步阻塞的问题,例如A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B

Android实战之 万能的接口回调

转载请标明原地址:http://blog.csdn.net/gaolei1201/article/details/47084111 前言:本人也算是自学"成才",呵呵,大学时尽管学的计算机,可是对软件开发却并不感兴趣. 毕业后看同学们或培训Android或培训IOS 4个月后都非常快找到了不错的工作.令我感到非常诧异,也非常羡慕!于是我做出了人生中重要的一个决定.開始学习Android.因为本人比較穷,所以选择自学. 学习的过程实为不易,从刚開始的一无所知时的苦苦挣扎,到学有所得后的应

Android实战简易教程-第五十四枪(通过实现OnScrollListener接口实现下拉刷新功能)

上一篇文章Android实战简易教程-第五十三枪(通过实现OnScrollListener接口实现上拉加载更多功能)讲述了如何实现上拉加载更多的功能,本篇,我们在上一篇的基础上实现下拉刷新功能.主要通过对滚动状态和手势监听实现这一功能,下面我们看一下代码: 1.header.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://sch

Android接口回调机制

开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A可以继续先做别的事情. 那么就只有当B解决完问题后告诉A问题解决了,A才可以能解决这个问题. 代码中比如最常用的: 一个Activity中给按钮一个接口回调方法,只有用户点击了这个按钮,告诉按钮被点击了,才会执行按钮接口回调的方法 Button btn = new Button(this); btn

Android实战简易教程-第五十三枪(通过实现OnScrollListener接口实现上拉加载更多功能)

支持上拉加载更多的控件有很多,但是你知道背后的原理吗?有一些面试官可能会问到这方便的知识,他们认为会用不是目的,懂背后的原理才是真人才.下面我们通过实现OnScrollListener接口实现上拉加载更多的效果,这里用到了回调接口,你需要对回调进行比较好的理解,回调机制是Android中很重要的机制,下面我们看一下代码: 1.定义一个footer.xml,用于下拉提示的效果: <?xml version="1.0" encoding="utf-8"?>

(转)Android之接口回调机制

开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A可以继续先做别的事情. 那么就只有当B解决完问题后告诉A问题解决了,A才可以能解决这个问题. 代码中比如最常用的: 一个Activity中给按钮一个接口回调方法,只有用户点击了这个按钮,告诉按钮被点击了,才会执行按钮接口回调的方法. Button btn = new Button(this); bt