博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android实战之 万能的接口回调
阅读量:5110 次
发布时间:2019-06-13

本文共 5608 字,大约阅读时间需要 18 分钟。

      

       转载请标明原地址:http://blog.csdn.net/gaolei1201/article/details/47084111

       前言:本人也算是自学“成才”,呵呵,大学时尽管学的计算机,可是对软件开发却并不感兴趣。

毕业后看同学们或培训Android或培训IOS 4个月后都非常快找到了不错的工作。令我感到非常诧异,也非常羡慕!于是我做出了人生中重要的一个决定。開始学习Android。因为本人比較穷,所以选择自学。

学习的过程实为不易,从刚開始的一无所知时的苦苦挣扎,到学有所得后的应对有策,全靠自己的勤学好问。

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

       学Java的人应该都知道面向对象的三大特征:封装、继承、多态。差点儿所有涉及到了接口和抽象。还有JAVA设计模式六大原则也差点儿所有涉及到了接口和抽象。由此能够看出抽象的重要性。抽象这个词听起来非常抽象,学起来也非常抽象,而接口是特殊的抽象类(类里面的方法所有是抽象方法)。那就更抽象了。

我一直知道抽象的存在,可是一直不知道怎么用它和它有什么优点。也不知道该怎样问别人。

于是就这么写着代码做着项目,直到有一次。

有人要问了,不会运用抽象、接口之类的东西不是也能写项目吗?我要说的是代码的质量不同,要不然砖家们为什么要发明它呀?!

      在做项目的过程中,有一次和做server的同事讨论点问题。他看了一下我的代码,然后发现了比較严重的问题,那是请求网络操作。我引用的是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,代码下载地址:

        接口回调的条件就是一个接口。两个类,两个类之间互相操作。不管是哪两个类,如Service和Activity,Fragment和Fragment。Fragment和Activity等等。它符合JAVA设计模式六大原则之依赖倒置原则。

 关于设计模式的六大原则可參考我的上篇博客: 。

     

       以下再讲一个样例说明。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之间通信的方法:

例如以下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");}

 关于接口回调的一些具体资料能够參考:

1、弄明确Android 接口回调机制: 

2、: 

3、 

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

这是Demo下载地址:

posted on
2017-05-27 19:27 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/mthoutai/p/6914224.html

你可能感兴趣的文章
JBOSS内存参数详解
查看>>
Centos7下关于系统用户密码规则-运维笔记
查看>>
nginx 杂记
查看>>
面试题17:合并两个排序的链表
查看>>
Jmeter HTTPS接口测试的证书导入
查看>>
Hibernate之Hibernate环境搭建
查看>>
php 计算概率,可以任意添加
查看>>
tms320dm6446内核启动分析 分类: DSP ...
查看>>
FZU 1856 The Troop (JAVA高精度)
查看>>
@Override annotation 出错
查看>>
在cnblog中使用syntax方法
查看>>
二分查找原理和实现
查看>>
SpringMVC responseBody注解分析
查看>>
Java基础---集合
查看>>
简单母函数专题
查看>>
Largest Submatrix 3 CodeForces - 407D (dp,好题)
查看>>
Connecting Vertices CodeForces - 888F (图论,计数,区间dp)
查看>>
Putting Boxes Together CodeForces - 1030F (带权中位数)
查看>>
jQuery - 添加元素
查看>>
Javascript入门笔记1-script标签
查看>>