浅谈Java回调机制
来源:互联网 发布:arduino和51单片机 编辑:程序博客网 时间:2024/06/10 19:03
回调机制让我们代码运行更加高效,也让我们代码变得非常的简洁明了!
首先我们用个案例来一步一步带入,当我们需要解析一段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
欢迎大家留言!
6 1
- 浅谈Java回调机制
- 以一个小demo浅谈Java回调机制
- 浅谈Java回调机制的简单理解
- Java 同步机制浅谈
- java同步机制浅谈
- Java 同步机制浅谈
- 浅谈Java代理机制
- 浅谈JAVA反射机制
- 浅谈Java代理机制
- 浅谈Java反射机制
- 浅谈java内存机制
- 浅谈Java 同步机制
- 浅谈Java代理机制
- 浅谈Java代理机制
- 浅谈java反射机制
- 浅谈Java多线程机制
- 浅谈Java反射机制
- Java反射机制浅谈
- 赶走职场“坏情绪”小妙招
- 报错:this class is not key value coding-compliant for the key closeLotTextField解决方法
- 求三角形面积
- 怎样查看PPT中的字数
- Number of Digit One
- 浅谈Java回调机制
- 常用socket函数详解
- 几种并行计算模型的区别(BSP LogP PRAM)
- Android_异常_IllegalStateException(待完善)
- AngularJS的内置过滤器总结
- Android样式的开发:selector篇
- 逆转一个整数的二进制表示问题
- 股市日记(一)
- ffmpeg学习(5)——av_register_all()