• 事件处理机制与Handler消息传递机制


    一、基于监听的事件处理机制

    1. 基于监听的时间处理机制模型:

    事件监听机制中由事件源,事件,事件监听器三类对象组成 处理流程如下:

    Step 1:为某个事件源(组件)设置一个监听器,用于监听用户操作

    Step 2:用户的操作,触发了事件源的监听器

    Step 3:生成了对应的事件对象

    Step 4:将这个事件源对象作为参数传给事件监听器

    step 5:事件监听器对事件对象进行判断,执行对应的事件处理器(对应事件的处理方法)

    1. 五种不同的使用形式

    1)       直接使用匿名内部类

    平时最常用的一种:直接setXxxListener后,重写里面的方法即可; 通常是临时使用一次,复用性不高!

    2)       使用内部类

    和上面的匿名内部类不同哦! 使用优点:可以在该类中进行复用,可直接访问外部类的所有界面组件!

    3)       使用外部类

    另外创建一个处理事件的Java文件,这种形式用的比较少!因为外部类不能直接访问用户界面类中的组件,要通过构造方法将组件传入使用;这样导致的结果就是代码不够简洁!

    4)       直接使用Activity作为事件监听器

    让Activity类实现XxxListener事件监听接口,在Activity中定义重写对应的事件处理器方法 eg:Actitity实现了OnClickListener接口,重写了onClick(view)方法在为某些组建添加该事件监听对象时,直接setXxx.Listener(this)即可

    5)       直接绑定到标签

    直接在xml布局文件中对应得Activity中定义一个事件处理方法 eg:public void myClick(View source) source对应事件源(组件) ,接着布局文件中对应要触发事件的组建,设置一个属性:onclick = "myclick"即可

            

    二、基于回调的事件处理机制

    当发生点击事件后不需要我们在Java文件中进行事件监听器的绑定就可以完成回调,即组件会处理对应的事件,即事件由事件源(组件)自身处理!

    1. 回调方法

    1)       将功能定义与功能分开的一种手段,一种解耦合的设计思想;

    2)       在Java中回调是通过接口来实现的, 作为一种系统架构,必须要有自己的运行环境,且需要为用户提供实现接口;

    3)       实现依赖于客户,这样就可以达到接口统一,实现不同;

    4)       系统通过在不同的状态下“回调”我们的实现类,从而达到接口和实现的分离!

    1. 两个使用场景

    1)       自定义View(组件)

    当用户在GUI组件上激发某个事件时,组件有自己特定的方法会负责处理该事件。

    通常用法:继承基本的GUI组件,重写该组件的事件处理方法,即自定义View 。

    常见View的回调方法:

    ①   在该组件上触发屏幕事件: boolean onTouchEvent(MotionEvent event);

    ②   在该组件上按下某个按钮时: boolean onKeyDown(int keyCode,KeyEvent event);

    ③   松开组件上的某个按钮时: boolean onKeyUp(int keyCode,KeyEvent event);

    ④   长按组件某个按钮时: boolean onKeyLongPress(int keyCode,KeyEvent event);

    ⑤   键盘快捷键事件发生::boolean onKeyShortcut(int keyCode,KeyEvent event);

    ⑥   在组件上触发轨迹球屏事件: boolean onTrackballEvent(MotionEvent event);

    ⑦   当组件的焦点发生改变,和前面的6个不同,这个方法只能够在View中重写哦! protected void onFocusChanged(boolean gainFocus, int direction, Rect previously FocusedRect)

    注意:在xml布局中使用自定义的view时,需要使用“全限定类名”

    2)       基于回调的事件传播

    View的回调方法的返回值都是boolean类型,返回值是用来标识这个方法是否已经完全处理完该事件。如果为false的话,说明没处理完,那么就传播出去,出发组件所在的Activity的相关回调方法;为true就不会传播。

    事件的传播顺序:监听器--->view组件的回调方法--->Activity的回调方法

                      

    三、Handler消息传递机制

    Handler的使用:

    1. Handler写在主线程中

    在主线程中,因为系统已经初始化了一个Looper对象,所以我们直接创建Handler对象,就可以进行信息的发送与处理。

    1. Handler写在子线程中

    如果是Handler写在了子线程中的话,我们就需要自己创建一个Looper对象了。创建的流程如下:

             1 )     直接调用Looper.prepare()方法即可为当前线程创建Looper对象,而它的构造器会创建配套的MessageQueue

    2 )     创建Handler对象,重写handleMessage( )方法就可以处理来自于其他线程的信息

    3 )     调用Looper.loop()方法启动Looper

  • 相关阅读:
    C#中Bitmap类实现对图像操作的一些方法
    C# GDI+ 文字操作
    C#中使用GDI+实现复杂打印
    【Python基础】json.dumps()和json.loads()、json.dump()和json.load()的区分
    【Python爬虫】selenium基础用法
    【Python爬虫】PyQuery解析库
    【Python爬虫】BeautifulSoup 解析库
    【Python爬虫】正则表达式与re模块
    【Python爬虫】Requests库的基本使用
    【Python基础】*args,**args的详细用法
  • 原文地址:https://www.cnblogs.com/pomodoro/p/11468998.html
Copyright © 2020-2023  润新知