浅谈Java回调机制

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

首先我们用个案例来一步一步带入,当我们需要解析一段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);
	}
}

假设当我们的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() {
			@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;
	}
}

上面就回调了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() {
			@Override
			public 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;
	@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","..");
	}
}

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

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

欢迎大家留言!


你可能感兴趣的:(android,细节,Android,技术拓展,浅谈Android开发细节)