一个例子让你弄懂回调和监听模式的用法

       首先还是老套路,先弄明白回调和监听者模式。(回调在我上篇分享已经提到过了,不懂的可以翻阅我写的点击打开链接(一个能让你一辈子不会忘记的例子))。

       监听者模式定义(这里实现的是一个简单的监听模式):监听器模式是对某种共有操作的监控。当此操作执行时对此操作作相应处理。

      监听模式实现步骤:

  1.      定义我们的监听器
  2.      抽象一个方法用于处理回调结果
  3.      给被监听者实现监听
  4.      监听者处理监听得到的数据


  下面以一个实例来囊括上述所说的内容:
 


     第一步:定义我们的监听器
 
/**
 * 定义我们的监听者
 */
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();
        }
    }
}
  
      这样就实现了我们监听的效果得到我们的数据。一些框架的请求很多多用到了基本的设计模式,这几个模式都比较经典,使用,学会号对理解一些框架底层的代码逻辑有很大的帮助。
     最后请支持原创,转载请标明转载出处。



   


  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值