回调机制让我们代码运行更加高效,也让我们代码变得非常的简洁明了!
首先我们用个案例来一步一步带入,当我们需要解析一段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;
@Override
protected void onCreate(Bundle savedInstanceState) {
parseJSON = new ParseJSON();
entity = parseJSON.parse(json);
}
}
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() {
@Override
public 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() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//解析完再传回Activity
Activity.onParseEnd(entity);
}
}).start();
return entity;
}
}
public TActivity extends BaseActivity(){
private ParseJSON parseJSON;
private String json = "Your JSON String";
private Entity entity;
@Override
protected void onCreate(Bundle savedInstanceState) {
parseJSON = new ParseJSON();
}
public void onParseEnd(Entity entity){
this.entity = entity;
}
}
这时候我们可以用面向接口编程的思路来设计:
public interface OnParseListener{
void onParseEnd(Entity entity);
void onParseFail();
}
public class ParseJSON{
private parse(String json,final OnParseListener parseListener){
*******解析部分省略*****
new Thread(new Runnable() {
@Override
public 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;
@Override
protected void onCreate(Bundle savedInstanceState) {
parseJSON = new ParseJSON();
parseJSON.parse(json,this);
}
@Override
public void onParseEnd(Entity entity){
this.entity = entity;
}
@Override
public void onParseFail(){
Log.e("parse fail","..");
}
}
public class ParseJSON{
private OnParseListener parseListener;
public void setOnParseListener(OnParseListener parseListener){
this.parseListener = parseListener;
}
private parse(String json){
*******解析部分省略*****
new Thread(new Runnable() {
@Override
public 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;
@Override
protected void onCreate(Bundle savedInstanceState) {
parseJSON = new ParseJSON();
parseJSON.setOnParseListener(new OnParseListener{
@Override
public void onParseEnd(Entity entity){
entity = entity;
}
@Override
public void onParseFail(){
Log.e("parse fail","..");
}
});
parseJSON.parse(json,this);
}
}
是不是觉得回调机制让代码变得更加效率简洁了?那就get起来吧!
博客地址:http://blog.csdn.net/caihongdao123
欢迎大家留言!