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");}



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


这不是对大牛说的。抽象、接口确实比较抽象这需要自己不断学习、总结,更重要的是在项目中去运用它,之后,你就会理解它的作用,发现它的优点,一回生二回熟三回你就成师傅了,Come on baby!Oh yeah!




3 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 上火嘴唇都肿了怎么办 嘴唇起泡后肿了怎么办 嘴唇上有白点颗粒状怎么办 嘴唇缺了一块红怎么办 人得钩端螺旋体怎么办 脖子上有鸡皮肤怎么办 不结婚老了以后怎么办 丁克族老了怎么办知乎 2个月宝宝咳嗽怎么办 干活累的手疼怎么办 脸上长白色的癣怎么办 全身起红斑很痒怎么办 宝宝脖子红烂了怎么办 背上长红斑很痒怎么办 身上起风疙瘩很痒怎么办 身上起小包很痒怎么办 浑身起红包很痒怎么办 手太粗糙怎么办小窍门 小腿长疙瘩很痒怎么办 腿过敏起红疙瘩怎么办 肚子上起红疙瘩很痒怎么办 小蚂蚁咬了肿了怎么办 锦鲤鱼尾巴烂了怎么办 泰迪身上长白毛怎么办 鱼身上有红斑了怎么办 新买锦鲤不吃食怎么办 鱼身上有红血丝怎么办 大腿内侧有红色条纹怎么办 腿上出现红血丝怎么办 孕妇有脚气,很痒怎么办 孕晚期脚气很痒怎么办 孕期有脚气很痒怎么办 激光后留下色沉怎么办 腋下很黑怎么办怎样才能变白 屁股上长一块癣怎么办 鼻两侧一热发红怎么办 脸上起皮发红痒怎么办 自癜风发红发痒怎么办 脸又干又痒怎么办 脸发红还有点痛怎么办 脸过敏了红痒怎么办