Android实战之 万能的接口回调
转载请标明原地址: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,代码下载地址:
http://download.csdn.net/detail/gaolei1201/8936209
接口回调的条件就是一个接口。两个类,两个类之间互相操作。不管是哪两个类,如Service和Activity,Fragment和Fragment。Fragment和Activity等等。它符合JAVA设计模式六大原则之依赖倒置原则。
关于设计模式的六大原则可參考我的上篇博客:http://blog.csdn.net/gaolei1201/article/details/47082783 。
以下再讲一个样例说明。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() {
@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是不行的。由于这样又又一次创造了一个LeftFragment,和原来初始化的那个不是 一个。会报空指针。由于LeftFragment的listener没有被set(实例化)。所以应该这样 LeftFragment.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");
}
关于接口回调的一些具体资料能够參考:
1、弄明确Android 接口回调机制:http://www.2cto.com/kf/201412/365788.html
2、android中的回调: http://blog.csdn.net/lindir/article/details/7819720
3、 一个经典样例让你彻彻底底理解java回调机制:http://blog.csdn.net/xiaanming/article/details/8703708/
这不是对大牛说的。抽象、接口确实比較抽象这须要自己不断学习、总结,更重要的是在项目中去运用它。之后,你就会理解它的作用,发现它的长处,一回生二回熟三回你就成师傅了,Come on baby!Oh yeah!
这是Demo下载地址:http://download.csdn.net/detail/gaolei1201/8936215
Android实战之 万能的接口回调的更多相关文章
- android app使用微信登录接口回调没有被执行的问题研究
本人开发的一个app使用了sharesdk集成微信登录功能,在测试的过程中微信授权登录界面有调用,但是授权后原应用的回调没有被执行 应用的包名是com.kimi.searcher 首先,确认微信点击授 ...
- Android开发之自定义组件和接口回调
说到自定义控件不得不提的就是接口回调,在Android开发中接口回调用的还是蛮多的.在这篇博客开始的时候呢,我想聊一下iOS的自定义控件.在iOS中自定义控件的思路是继承自UIView, 在UIVie ...
- Android中的接口回调技术
Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James ...
- Android接口回调机制
开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A ...
- Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- (转)Android之接口回调机制
开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A ...
- Android 中的接口回调
http://blog.csdn.net/wangjinyu501/article/details/22052187 在Android中到处可见接口回调机制,尤其是UI事件处理方面.举一个最常见的 ...
- 弄明白Android 接口回调机制
以前对于这个机制理解不够深刻,现在重新整理下思路. 一.建模 我理解的接口回调就是,我这个类实现了一个接口里的方法doSomething,然后注册到你这里,然后我就去做别的事情去了,你在某个触发的时机 ...
- android 开发 ScrollView 控件的一些api描述与自定义ScrollView接口回调方法
1.正常使用ScrollView控件的一些api详解. package com.example.lenovo.mydemoapp.scrollViewDemo; import android.supp ...
随机推荐
- jsp文件就是Servlet,可以在tomcat里进行查看
D:\apache-tomcat-8.0.21\work\Catalina\localhost\springmvc2\org\apache\jsp\index_jsp.class
- 10 在C#中读取文件
我们在前一个练习中已经了解了如何在C#控制台程序(console)中读取用户的输入.现在我们要学习如何从一个文件中读取内容.在下面的练习中,你要格外小心.关于文件的操作,一不小心会损失你的重要文件. ...
- fresh_bank、、
最近新学习了一个bank系统来和大家分享一下,新人求罩! 破索式之_链子枪_ 废话不多说了直接本主题 如果我们要写出bank系统,就要先考虑这个问题:总共需要几个类? 既然是银行系统,那么必不可少的就 ...
- JVM中线程状态转换图
JVM中线程的状态转换图 线程在一定条件下,状态会发生变化.线程一共有以下几种状态: 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该 ...
- webstorm进行VisualSVN配置及上传项目到项目库
以前建站一直都是自己一个人,最近要做一个比较大的网站,寻思着利用svn在整个开发过程中会比较快,于是摸索着配置了一下. 首先,下载VisualSVN这个软件,官网链接 https://www.visu ...
- html——行内元素、块元素、行内块元素
行内元素:span ,a, ,strong , em, del, ins.特点:在一行上显示:不能直接设置宽高:元素的宽和高就是内容撑开的宽高. 块元素:div,h1-h6,p,ul,li.特 ...
- (转) 分布式文件存储FastDFS(七)FastDFS配置文件详解
http://blog.csdn.net/xingjiarong/article/details/50752586 配置FastDFS时,修改配置文件是很重要的一个步骤,理解配置文件中每一项的意义更加 ...
- Lua中返回值的丢失问题
Lua中返回值的丢失问题 -- 如果函数调用所得的多个返回值是另外一个函数的最后一个参数,或者是多指派表达式中的最后一个参数时,所有返回值将被传入或使用. -- 否则只有第一个返回值被使用或指定. T ...
- pandas格式化str为时间,pandas将int转化为str
code_300['HISTORY_DATE'] = code_300['HISTORY_DATE'].map(str)code_300['HISTORY_DATE'] = pd.to_datetim ...
- time模块和datatime模块
一.time模块 time.time() 获取时间戳 time.sleep() 睡几秒 time.gmtime() utc时间元组 time.localtime() 本地时间元组 time.mktim ...