Android实战之 万能的接口回调
来源:互联网 发布:国际象棋在线对弈软件 编辑:程序博客网 时间:2024/06/08 13:21
转载请标明原地址:http://blog.csdn.net/gaolei1201/article/details/47084111
前言:本人也算是自学“成才”,呵呵,大学时虽然学的计算机,但是对软件开发却并不感兴趣。毕业后看同学们或培训Android或培训IOS 4个月后都很快找到了不错的工作,令我感到很诧异,也很羡慕!于是我做出了人生中重要的一个决定,开始学习Android,由于本人比较穷,所以选择自学。学习的过程实为不易,从刚开始的一无所知时的苦苦挣扎,到学有所得后的应对有策,全靠自己的勤学好问。由于自己以前也困于抽象、接口等“吓人”的东西,网上又缺乏在项目中实战运用的讲解,下面我就斗胆把自己的理解和大家交流一下下。
学Java的人应该都知道面向对象的三大特征:封装、继承、多态,几乎全部涉及到了接口和抽象,还有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
接口回调的条件就是一个接口,两个类,两个类之间互相操作。无论是哪两个类,如Service和Activity,Fragment和Fragment,Fragment和Activity等等。它符合JAVA设计模式六大原则之依赖倒置原则。 关于设计模式的六大原则可参考我的上篇博客:http://blog.csdn.net/gaolei1201/article/details/47082783 。
关于接口回调的一些详细资料可以参考:
http://www.2cto.com/kf/201412/365788.html 和 http://blog.csdn.net/lindir/article/details/7819720
下面再讲一个例子说明,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的例子。当然你也可以用官方提供的Fragment之间通信的方法:http://blog.csdn.net/gaolei1201/article/details/47045461
如下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是不行的,因为这样又重新创造了一个RightFragment,和原来初始化的那个不是 一个,会报空指针,因为RightFragment的listener没有被set(实例化)。所以应该这样 RightFragment.setOnFragmentChangeListener(this);*/RightFragment.setOnFragmentChangeListener(this);change_activity_bt.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub//在这里执行接口方法onFragmentChangeListener.onFragmentChange();}});return view;}@Overridepublic 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是不行的,因为这样又重新创造了一个LeftFragment,和原来初始化的那个不是 一个,会报空指针,因为LeftFragment的listener没有被set(实例化)。所以应该这样 LeftFragment.setOnFragmentChangeListener(this);*/LeftFragment.setOnFragmentChangeListener(this);change_activity_bt.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub//在这里执行接口方法onFragmentChangeListener.onFragmentChange();}});return view;}@Overridepublic void onFragmentChange() {// 在子类中实现接口的方法show_change_text.setText("I am RightFragment,and I have changed");}
这不是对大牛说的。抽象、接口确实比较抽象这需要自己不断学习、总结,更重要的是在项目中去运用它,之后,你就会理解它的作用,发现它的优点,一回生二回熟三回你就成师傅了,Come on baby!Oh yeah!
- Android实战之 万能的接口回调
- android 万能回调接口
- Android之万能适配器Adapter的使用
- Android之打造ListView的万能适配器
- Android RecylerView之万能适配器的实现
- 万能的函数 之 接口继承 实现继承~~~
- Android万能的指示器
- Android listView 之万能Adapter
- android万能适配器之SuperAdapter
- Android之listview万能适配器
- android学习之路之接口回调的理解
- Android基础之打造自己的魔法万能适配器
- android之实现万能适配RecyclerView的adapter
- android学习之简单的接口回调使用
- 万能的webView之Activity
- Android 真正的“万能”Adapter
- android万能的Listview适配器
- android打造万能的适配器
- template
- 3.决策树Decision Tree
- A - Accurately Say "CocaCola"! --- (first qualifying)
- [HDU 2191]悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
- 【数据库】查询语句
- Android实战之 万能的接口回调
- UVA 127 ``Accordian'' Patience
- 7月27日--爬虫心得
- FZU 2168 防守阵地 I(公式推导)(经典)(中等)
- ngx_listening_s
- modle factory
- R语言支持向量机SVM
- 开发团队周总结流水20150724
- python class __slots__