导图社区 安卓事件处理
这是一篇关于安卓事件处理的思维导图,包含监听,回调,hanlder,AsyncTask等内容。
编辑于2021-08-31 22:29:52安卓事件处理
基于监听的事件处理
处理模型
事件源是事件触发的载体,如发生点击事件的按钮 事件则是点击按钮 事件监听器:根据事件做出响应
事件源
事件
事件监听器(核心)
常见监听接口
view.onclicklistener()
view.oncreatecontextmenulistener()
view.onfocuschangelistener()
View.OnKeyListener()
四种实现方式
内部类和匿名内部类的实现方式,就是我们最常见的: view.setClickListener(new Listener(){ @override public void onClick(){ 代码 } }) 外部类:定义一个类,实现相应接口 Activity本身作为事件监听器:Activity 实现相应接口 ps: 外部类和Activity作为监听器的区别只是一个是Activity,一个是普通的外部类
内部类
外部类
Activity本身作为事件监听器
匿名内部类
基于回调的事件处理
回调机制与监听相比,区别在: 监听机制中事件源和时间监听器是分离的,而回调机制中事件源和事件监听器是统一的 例如: 一个Button 重写了onKeyDown()方法,那么在发生点击事件,则直接调用该方法。
UI组件常用回调方法(返回值为布尔值)
onKeyDown()
onKegLongPress()
onKerShortCut()
onKeyUp()
onTouchEvent(
onTrackballEvent()
基于回调的事件传播
回调方法返回值: TRUE: 处理方法已经完全处理该事件,不会继续传播 FALSE: 处理方法并未完全处理该事件,该事件会传播出去。
回调方法返回true,结束传播
回调方法返回false,继续传播
回调向上传播,由组件向Activity传播
响应系统设置的事件
应用随着系统设置的变化而做出相应改变
Configuration类
获取Configuration对象:getResources().getConfjguration(
获取系统配置信息
重写onConfigurationChanged()方法
当系统配置发生改变时候,如横竖屏切换,系统会回调该方法,所以重写该方法可以响应系统配置的变化。 ps: 需要Activity响应屏幕等配置变化,需要在AndroidManifest.xml中进行配置
Handler消息传递机制
安卓只允许在UI线程中修改Activity的UI组件。 当需要新启动的线程周期性的改变界面组件的属性值,则需要借助Handler消息传递机制。
Handle类作用
在新启动的线程中发送消息 在主线程中获取,处理消息
Handler类方法
hanldeMessage(Message message)
hasMessage()
obtainMessage()
sendEmptyMessage()
sendEmptyMessageDelayed()
sendMessage(Message message)
sendMessageDelayed()
四大组件
Message
MessageQueue
消息队列,先进先出的方式管理Message, 程序在创建Looper对象的时候,会在构造器中创建MessageQueue对象,MessageQueue由Looper管理。
Looper
每个线程只能拥有一个Looper
UI线程
UI线程中,系统已经初始化了一个Looper对象,所以在UI线程中,直接使用Handler发送,处理消息即可。
子线程
在子线程中,必须自己创建一个Looper对象。可以通过调用Looper的prepare()来创建一个Looper
主要方法
prepare()
用于创建Looper对象
loop()
loop方法使用一个死循环不断从MessageQueue中取出消息,并将取出的消息分给该消息对应的Handler进行处理
Handler
用于发送和处理消息。 Handler发送的消息必须被送到指定的MessageQueue。 因为需要有MessageQueue,,所以当前线程必须要有一个Looper对象。
线程中使用Handler步骤
1.调用Looper的prepare()方法创建Looper对象,同时MessageQueue被创建
2.创建Handler子类的实例
3.调用Looper的loop方法启动Looper
AsyncTask异步任务
为解决新线程不能更新UI组件问题,AsyncTask可以用于解决,而且使用比较简单
子线程不能更新UI组件,常见解决方案
使用Handler实现线程间通信
Activity.runOnUIThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable)
AsyncTask
AsyncTask(Params,Progress,Result)
AsyncTask 是一个抽象类,通常用于被继承。
Params
启动任务执行的输入参数的类型
Progress
后台任务完成的进度值的类型
Result
后台任务执行完成后返回结果的类型
AsyncTask使用步骤
1.创建AsyncTask子类
2.实现AsyncTask的方法
doInBackGround()
该方法在子线程中执行,用于后台线程将要完成的任务。该方法可以调用publishProgress()方法更新任务执行进度。
onProgressUpdate(Progress)
该方法在UI线程中执行,在doInBackground方法中调用publishProgress()更新任务执行进度后,将会触发该方法。
onPreExcute()
该方法在UI线程中执行,用于在执行耗时任务前被调用,通常用于做一些初始化的准备工作.
onPostExcute(Result result)
该方法在UI线程中执行,当doInBackGround()方法完成后,调用该方法,并将doInBackGround()的返回值传递给该方法。
3.调用AsyncTask的execute()方法
使用规则
1.必须在UI线程中创建AsyncTask
2. 必须在UI线程中调用AsyncTask的execute()方法
3. AsyncTask的方法由系统负责调用
4.每个AsyncTask只能被执行一次,多次调用会发生异常