Android事件处理

(一)基于回调的事件处理
事件源
事件
事件监听器(注册一个监听器要实现View.XxxListener()接口即可)
实现事件监听的四种形式
1.内部类形式
2.外部类形式
3.Activity本身作为事件监听器
4.匿名内部类形式
(二)基于监听的事件处理
Android为所有的GUI都提供了一些事件处理回调的方法,以View为例
boolean onKeyDown(int  keyCode,KeyEvent  event)
boolean onKeyLongPress(int keyCode,KeyEvent  event)
boolean onKeyShortcut(int  keyCode,KeyEvent  event)
boolean onKeyUp(int  keyCode,KeyEvent  event)
boolean onTouchEvent(int  keyCode,KeyEvent  event)
boolean onTrackballEvent(MotionEvent  event)
该布尔返回值用于标识该处理方法能否完全处理该事件
Android系统最开始触发的是按键上绑定的事件监听器,然后再触发该组件提供的事件回调方法,最后会传播到该组件所在的Activity
(三)直接绑定到标签
定义一个方法
public void clickXxx(View source){
//通过findViewById获取组件
.......
}
在XML文件中定义
android:onClick="clickXxx"
(四)响应系统设置的事件
Configuration类简介
系统可以通过如下方法获取Configuration对象
Configuration cfg = getResources().getConfiguration();
该对象具有如下常用的属性
public float fontScale 字体的缩放因子
public int keyboard 当前设备所关联的设备类型
public int keyboardHidden 当前键盘是否可用
public Locale locale 获取用户当前的Locale
public int mcc 移动信号的国家码
public int mnc 移动信号的网络码
public int navigation 系统方向导航设备的类型
public int orientation 系统屏幕方向返回值可能是ORIENTATION_LANDSCAPE(横向屏幕),
ORIENTATION_PORTRAIT(竖屏屏幕),ORIENTATION_SQUARE(方形屏幕)
public int touchscreen 触摸方式
重写onConfigurationChanged方法响应系统设置更改
设置屏幕方向
MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
为了让Activity能够监听屏幕方向改变
指定android:configChanges属性,支持mcc.mnc,orientation、、、等属性值
其中orientation|screenSize指定可以监听屏幕方向改变的属性值
(五)Handler消息传递机制
只允许UI线程(主线程)修改Activity里面的UI组件
1.Handler类简介
Handler类的主要作用有两个
1.在新启动的线程中发送消息
2.在主线程中获取,处理消息
final Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg){

         if(msg.what==0xXXX){
........
}
}
}
new Thread(new Runnable(){
@Override
public void run(){
myHandler.sendMessage(Message msg);
//myHandler.sendEmptyMessage(int what)
}
}).start();
2.理解Handler,Looper,MessageQueue的工作原理
Handler负责处理和接收消息
Looper负责读取MessageQueue的消息
MessageQueue负责保存消息
MessageQueue是由Looper对象进行管理的。为了保证Looper对象正常工作。分两种情况
1.在主UI线程中,系统已经初始化一个Looper对象了,因此程序可以直接创建Handler即可
2.程序员自己启动子线程,必须自己创建一个Looper对象,并启动它。调用其prepare()方法即可
在线程中使用Handler的步骤如下:
1.调用Looper的prepare()方法创建Looper对象(Looper.prepare();)
2.创建Handler实例,重写HandlerMessage方法(在run()方法里面重写),该方法负责处理来自于其他线程的消息
调用loop()方法启动Looper(Looper.loop();)
Android默认约定当UI线程堵塞20s时将会引发ANR异常,所以不要在UI线程中执行耗时的操作。
3.异步任务
为了解决新线程不能更新UI组件的问题,Android提供了如下几种解决方案
1.使用Handler实现线程之间的通信
2.Activity.runOnUiThread(Runable)
3.View.post(Runable)
4.View.postDelayed(Runable,long)
AsyncTask<Params,Progress,Result>是一个抽象类,被继承时通常要指定三个泛型参数
1.Params:启动任务执行的输入参数类型
2.Progress:后台任务完成进度值的类型
3.Result:后台执行任务完成后返回结果的类型
如果某个参数不需要指定,则指定它为void
根据需要实现AsyncTask的如下方法
1.doInBackground(Params...)重写该方法就是后台线程将要完成的任务,该方法调用publishProgress(Params... values)方法更新任务的执行进度
2.onProgressUpdate(Progress... values)在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,就会触发该方法
3.onPreExecute()该方法将在执行后台耗时操作前调用,通常该方法用于完成一些初始化的准备工作,比如在界面上显示进度条。
4.onPostExecute()方法,当doInbackground()方法会自动执行该方法,并将doInbackground方法的返回值传给该方法
使用规则
1.在UI线程中必须创建AsyncTask实例
2.在UI线程中调用AsyncTask的execute()方法
3.AsyncTask的onPreExecute().....方法将由android系统调用,不应该由程序员调用
4.每个AsyncTask只能被执行一次,多次调用将会引发系统异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值