1. 程式人生 > >一個例子讓你弄懂回撥和監聽模式的用法

一個例子讓你弄懂回撥和監聽模式的用法

       首先還是老套路,先弄明白回撥和監聽者模式。(回撥在我上篇分享已經提到過了,不懂的可以翻閱我寫的點選開啟連結(一個能讓你一輩子不會忘記的例子))。

       監聽者模式定義(這裡實現的是一個簡單的監聽模式):監聽器模式是對某種共有操作的監控。當此操作執行時對此操作作相應處理。

      監聽模式實現步驟:

  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();
        }
    }
}
  
      這樣就實現了我們監聽的效果得到我們的資料。一些框架的請求很多多用到了基本的設計模式,這幾個模式都比較經典,使用,學會號對理解一些框架底層的程式碼邏輯有很大的幫助。      最後請支援原創,轉載請標明轉載出處。