一個例子讓你弄懂回撥和監聽模式的用法
阿新 • • 發佈:2019-02-03
首先還是老套路,先弄明白回撥和監聽者模式。(回撥在我上篇分享已經提到過了,不懂的可以翻閱我寫的點選開啟連結(一個能讓你一輩子不會忘記的例子))。
監聽者模式定義(這裡實現的是一個簡單的監聽模式):監聽器模式是對某種共有操作的監控。當此操作執行時對此操作作相應處理。
監聽模式實現步驟:
- 定義我們的監聽器
- 抽象一個方法用於處理回撥結果
- 給被監聽者實現監聽
- 監聽者處理監聽得到的資料
第三步:/** * 定義我們的監聽者 */ 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(); } } }
這樣就實現了我們監聽的效果得到我們的資料。一些框架的請求很多多用到了基本的設計模式,這幾個模式都比較經典,使用,學會號對理解一些框架底層的程式碼邏輯有很大的幫助。 最後請支援原創,轉載請標明轉載出處。