回调机制让我们代码运行更加高效,也让我们代码变得非常的简洁明了!

首先我们用个案例来一步一步带入,当我们需要解析一段JSON字符串时大部分我们的操作就是:

public class ParseJSON{private Entity parse(String json){*******解析部分省略*****return entity;}}

我们要在调用时就会是:

public TActivity extends BaseActivity(){private ParseJSON parseJSON;private String json = "Your JSON String";private Entity entity;@Overrideprotected void onCreate(Bundle savedInstanceState) {parseJSON = new ParseJSON();entity = parseJSON.parse(json);}}

假设当我们的JSON足够复杂,解析过程要3秒:

public class ParseJSON{private Entity parse(String json){*******解析部分省略*****try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return entity;}}


这样就会阻塞我们的主线程,然后有的同学就会说我们用新的子线程:

public class ParseJSON{private Entity parse(String json){*******解析部分省略*****new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}                                return entity;}}).start();}}


这样的话我们第一次返回的是null,而第二次才会返回解析的结果

原因:因为第一次请求得到的是还未赋值的空的对象,而第二次得到的是第一次解析后,赋给entity的值!

这就是开启异步请求获取数据。

这时候我们就可以考虑使用回调机制了,修改一下代码:

public class ParseJSON{private Entity parse(String json){*******解析部分省略*****new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}                                //解析完再传回ActivityActivity.onParseEnd(entity);}}).start();return entity;}}public TActivity extends BaseActivity(){private ParseJSON parseJSON;private String json = "Your JSON String";private Entity entity;@Overrideprotected void onCreate(Bundle savedInstanceState) {parseJSON = new ParseJSON();}public void onParseEnd(Entity entity){this.entity = entity;}}

上面就回调了Activity的方法,但是当我们解析出现错误时,如何通知Activity呢?

这时候我们可以用面向接口编程的思路来设计:

public interface OnParseListener{        void onParseEnd(Entity entity);        void onParseFail();}
public class ParseJSON{private parse(String json,final OnParseListener parseListener){*******解析部分省略*****new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}try{parseListener.onParseEnd(entity);}catch(Exception e){parseListener.onParseFail();}}});}}

这样只有需要parse()方法的地方,实现OnParseListener接口就可以调用这个方法了
通过监听回调的形式进行解耦

public TActivity extends BaseActivity() implements OnParseListener{private ParseJSON parseJSON;private String json = "Your JSON String";private Entity entity;@Overrideprotected void onCreate(Bundle savedInstanceState) {parseJSON = new ParseJSON();parseJSON.parse(json,this);}@Overridepublic void onParseEnd(Entity entity){this.entity = entity;}@Overridepublic void onParseFail(){Log.e("parse fail","..");}}

我们还可以像写onClick事件一样,添加一个set方法即可:

public class ParseJSON{private OnParseListener parseListener;public void setOnParseListener(OnParseListener parseListener){        this.parseListener = parseListener;}private parse(String json){*******解析部分省略*****new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}try{parseListener.onParseEnd(entity);}catch(Exception e){parseListener.onParseFail();}}});}}
public TActivity extends BaseActivity() implements OnParseListener{private ParseJSON parseJSON;private String json = "Your JSON String";private Entity entity;@Overrideprotected void onCreate(Bundle savedInstanceState) {parseJSON = new ParseJSON();parseJSON.setOnParseListener(new OnParseListener{@Overridepublic void onParseEnd(Entity entity){entity = entity;}@Overridepublic void onParseFail(){Log.e("parse fail","..");}});parseJSON.parse(json,this);}}

到这里,我们的回调机制就讲完了,相信大家也有所有了解。

是不是觉得回调机制让代码变得更加效率简洁了?那就get起来吧!


博客地址:http://blog.csdn.net/caihongdao123

欢迎大家留言!


更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Andriod中的Handler机制
  3. android客户端访问服务端tomcat
  4. Android四大组件:BroadcastReceiver史上最全面解析
  5. android的touch事件分发响应机制
  6. Mars视频笔记——广播机制
  7. Android(安卓)Binder机制(2) ContextManager注册过程分析
  8. Android图片加载框架最全解析(一),Glide的基本用法
  9. Android(安卓)面试题之系统相关

随机推荐

  1. Android使用过程中的一些小知识
  2. android java 拷贝数据库文件到U盘,从U盘
  3. 编译android遇到java虚拟机堆内存不够的
  4. Android-将RGB彩×××转换为灰度图
  5. 一起学android之设置资源图片为圆角图片
  6. 新版3.6.1 Android Studio 解决AndroidSt
  7. 我的博客正式成立啦~
  8. android选取照片并以其uri取得绝对路径
  9. 自定义Tab1
  10. 完全卸载 Android Studio