基于監聽和基于回調的事件處理機制

基于監聽的事件處理機制

流程模型圖

文字描述:
事件監聽機制中由事件源,事件,事件監聽器三類對象組成 處理流程如下: Step 1:為某個事件源(組件)設置一個監聽器,用于監聽用戶操作 Step 2:用戶的操作,觸發了事件源的監聽器 Step 3:生成了對應的事件對象 Step 4:將這個事件源對象作為參數傳給事件監聽器 step 5:事件監聽器對事件對象進行判斷,執行對應的事件處理器(對應事件的處理方法)

基于回調的事件處理機制

回調:一種解耦合的設計思想:分離 功能定義 與 功能。在Java中回調是通過接口來實現的,達到接口統一,實現不同。

  • 回調和監聽的異同:
    基于監聽的事件處理機制,簡單說就是為事件源(組件)添加一個監聽器,然后當用戶觸發了事件后交給監聽器去處理,根據不同的事件執行不同的操作。
    對于基于回調的事件處理模型來說,事件源與事件監聽器是統一的,或者說事件監聽器完全消失了。當用戶在GUI組件上激發某個事件時,組件自己特定的方法將會負責處理該事件。

  • 兩個使用場景:

    • 1 自定義view

    當用戶在GUI組件上激發某個事件時,組件有自己特定的方法會負責處理該事件 通常用法:繼承基本的GUI組件,重寫該組件的事件處理方法,即自定義view 注意:在xml布局中使用自定義的view時,需要使用"全限定類名"

    實現代碼: MyButton.java

      public class MyButton extends Button{  
      private static String TAG = "呵呵";  
      public MyButton(Context context, AttributeSet attrs) {  
          super(context, attrs);  
      }  
    
      //重寫鍵盤按下觸發的事件  
      @Override  
      public boolean onKeyDown(int keyCode, KeyEvent event) {  
          super.onKeyDown(keyCode,event);  
          Log.i(TAG, "onKeyDown方法被調用");  
          return true;  
      }  
    
      //重寫彈起鍵盤觸發的事件  
      @Override  
      public boolean onKeyUp(int keyCode, KeyEvent event) {  
          super.onKeyUp(keyCode,event);  
          Log.i(TAG,"onKeyUp方法被調用");  
          return true;  
      }  
    
      //組件被觸摸了  
      @Override  
      public boolean onTouchEvent(MotionEvent event) {  
          super.onTouchEvent(event);  
          Log.i(TAG,"onTouchEvent方法被調用");  
          return true;  
      }  
    } 
    

    因為我們直接重寫了Button的三個回調方法,當發生點擊事件后就不需要我們在Java文件中進行 事件監聽器的綁定就可以完成回調,即組件會處理對應的事件,即事件由事件源(組件)自身處理!

    • 2 基于回調的事件傳播:



      代碼示例:

    public class MyButton extends Button{  
      private static String TAG = "呵呵";  
      public MyButton(Context context, AttributeSet attrs) {  
          super(context, attrs);  
      }  
    
      //重寫鍵盤按下觸發的事件  
      @Override  
      public boolean onKeyDown(int keyCode, KeyEvent event) {  
          super.onKeyDown(keyCode,event);  
          Log.i(TAG, "自定義按鈕的onKeyDown方法被調用");  
          return false;  
      }  
    }
    

    MainActivity.java:

    public class MyActivity extends ActionBarActivity {  
      @Override  
      protected void onCreate(Bundle savedInstanceState) {  
          super.onCreate(savedInstanceState);  
          setContentView(R.layout.activity_my);  
    
          Button btn = (Button)findViewById(R.id.btn_my);  
          btn.setOnKeyListener(new View.OnKeyListener() {  
              @Override  
              public boolean onKey(View v, int keyCode, KeyEvent event) {  
                  if(event.getAction() == KeyEvent.ACTION_DOWN)  
                  {  
                      Log.i("呵呵","監聽器的onKeyDown方法被調用");  
                  }  
                  return false;  
              }  
          });  
      }  
    
      @Override  
      public boolean onKeyDown(int keyCode, KeyEvent event) {  
          super.onKeyDown(keyCode, event);  
          Log.i("呵呵","Activity的onKeyDown方法被調用");  
          return false;  
      }  
    } 
    

    運行截圖:


    結果分析: 從上面的運行結果,我們就可以知道,傳播的順序是: 監聽器--->view組件的回調方法--->Activity的回調方法;返回值false繼續傳播,true終止傳播

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。