首先还是老套路,先弄明白回调和监听者模式。(回调在我上篇分享已经提到过了,不懂的可以翻阅我写的点击打开链接(一个能让你一辈子不会忘记的例子))。
监听者模式定义(这里实现的是一个简单的监听模式):监听器模式是对某种共有操作的监控。当此操作执行时对此操作作相应处理。
监听模式实现步骤:
- 定义我们的监听器
- 抽象一个方法用于处理回调结果
- 给被监听者实现监听
- 监听者处理监听得到的数据
下面以一个实例来囊括上述所说的内容:
第一步:定义我们的监听器
/**
* 定义我们的监听者
*/
public interface callBack {
//抽象我们的回调方法
void loadFinsh(Bitmap bitmap);
}
第三步:
/**
* Created by Administrator on 2017/12/27.
*/
public class Utils {
private ExecutorService mThreadPool;
//优化线程的工具,在这里进行我们请求成功数据的回调
private Handler mhandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case Constant.ERROR:
if(calLBackListener!=null){
calLBackListener.loadFinsh(null);
}
break;
case Constant.SUCCESS:
if(calLBackListener!=null){//当监听者不为空的时候开始我们的回调
calLBackListener.loadFinsh((Bitmap) msg.obj);
}
break;
}
}
};
private static Utils helper;
private Utils(){
//创建单线
mThreadPool = Executors.newSingleThreadExecutor();
}
public static Utils getInstace(Context context){
if(helper ==null){
helper = new Utils();
}
return helper;
}
/**
*
* 这里是我们监听的具体实现
*/
//监听自己
private callBack calLBackListener;
//注册监听事件,也是暴露给外部的一个自己被别人de监听方法
public void setCalLBackListener(callBack calLBackListener){
this.calLBackListener = calLBackListener;
}
//用于去请求数据的方法
public void loader(){...}
//用来获取bitmap
public Bitmap get(){...}
}
public class MainActivity extends Activity implements View.OnClickListener,callBack {
private Button btn;
private ImageView img;
private Utils utils;
//优化线程处理,这里去显示我们的图片
private Handler mHandler = new Handler(){ };
@Override
protected int getContentLayoutId() {
return R.layout.activity_main;
}
//在初始化我们的窗口的时候去注册我们的监听器,让其去监听Utils
@Override
protected void initWindow() {
utils = Utils.getInstace(this);
utils.setCalLBackListener(this);
}
//实例化我们的控件
@Override
protected void initWidget() {...}
@Override
protected void initEven() {
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
/**
* 普通的静态加载法来实现
*/
if(utils!=null){
utils.loader();
}
}
//实现了监听的接口,这里去处理我们回调回来的数据
@Override
public void loadFinsh(Bitmap bitmap) {
if(bitmap!=null){
Log.i("loadFinsh","loadFinsh");
mHandler.obtainMessage(Constant.SUCCESS,bitmap).sendToTarget();
}else{
Log.i("loadFinsh","err");
Toast.makeText(this,"无法加载",Toast.LENGTH_SHORT).show();
}
}
}
这样就实现了我们监听的效果得到我们的数据。一些框架的请求很多多用到了基本的设计模式,这几个模式都比较经典,使用,学会号对理解一些框架底层的代码逻辑有很大的帮助。
最后请支持原创,转载请标明转载出处。