Android的事件处理2
2015-10-14 21:42
411 查看
Handler:它的作用有两个——发送消息和处理消息,程序使用Handler发送消息,由Handler发送的消息必须被送到指定的MessageQueue。也就是说希望Handler正常工作,必须在当前线程中有一个MessageQueue;否则消息就没有MessageQueue进行保存了。不过MessageQueue是由Looper负责管理的,也就是说,如果希望Handler正常工作,必须在当前线程中有一个Looper对象,为了保证当前线程中有Looper对象可如下两种处理:
在主UI线程中,系统已经初始化了一个Looper对象,应此程序直接创建Handler即可,然后就可以通过Handler发来消息、处理消息。
程序员自己启动子线程,必须自己创建一个Looper对象,并启动它。创建Looper对象调用它的prepare()方法即可。
Looper:每个线程只有一个Looper,它负责管理MessageQueue,会不断从MessageQueue中取出消息,并将消息分给对象给对应的Handler处理。
MessageQueue:有Looper负责管理,它采用先进先出的方式来管理Message。
Handler:它能把消息发送给Looper管理的MessageQueue,并负责处理Looper分给它的消息。
线程中使用Handler的步骤如下:
调用了Looper的prepare()的方法为当前线程创建Looper对象,创建Looper对象时,它的构造器会创建与之配套的MessageQueue。
有了Looper之后,创建了Handler子类的实例,重写handlerMessage()方法,该方法负责处理来自其他线程的消息。
调用Looper的Loop()方法Looper。
一、解决新线程无法更新UI组建问题的方案
为了解决新线程不能更新UI组建的问题,Andorid提供了如下几种解决方案:
使用Handler实现线程之间的通信。
Activity.runOnUiThread(Runnable)。
View.post(Runnable)。
View.postDelayed(Runnable)。
二、ANR(Application Not Responding)异常
Android默认约定当UI线程阻塞超过20秒将会引发ANR(Application Not Responding)异常。但实际上,不要说20秒,即使是5秒甚至2秒,用户都会感到十分不爽。因此,没必要去记这个20秒的时间限度。总之,开发者必须牢记:不要在UI线程中执行一些耗时操作。
三、AsyncTask抽象类
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数:
Params:启动任务执行的输入参数的类型。
Progress:后台任务完成进度值的类型。
Result:后台执行任务完成后返回结果的类型。
四、AsyncTask的特点
更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可。
五、使用AsyncTask的步骤
1.创建AsyncTask的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,可将它指定为void。
2.根据需要,实现AsyncTask的如下方法:
doInBackground(Params …):后台线程将要完成的任务,可以调用publishProgress(Progress... values)方法更新任务执行进度。
onProgressUpdate(Progress... values):在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,就会触发该方法。
onPreExecute():执行后台耗时操作前被调用,通常用户完成一些初始化操作,比如在界面上显示进度条。
onPostExecute(Result result):当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground方法返回的值传给该方法。
3.调用AsyncTask子类的实例的execute(Params... params)开始执行耗时任务。
六、使用AsyncTask时必须遵守的规则
必须在UI线程中创建AsyncTask的实例。
必须在UI线程中调用AsyncTask的execute()方法。
AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params... params)、onProgressUpdate(Progress... values)方法,不应该由程序员代码调用,而是由Android系统负责调用。
每个AsyncTask只能被执行一次,多次调用将会引发异常。
在主UI线程中,系统已经初始化了一个Looper对象,应此程序直接创建Handler即可,然后就可以通过Handler发来消息、处理消息。
程序员自己启动子线程,必须自己创建一个Looper对象,并启动它。创建Looper对象调用它的prepare()方法即可。
Looper:每个线程只有一个Looper,它负责管理MessageQueue,会不断从MessageQueue中取出消息,并将消息分给对象给对应的Handler处理。
MessageQueue:有Looper负责管理,它采用先进先出的方式来管理Message。
Handler:它能把消息发送给Looper管理的MessageQueue,并负责处理Looper分给它的消息。
线程中使用Handler的步骤如下:
调用了Looper的prepare()的方法为当前线程创建Looper对象,创建Looper对象时,它的构造器会创建与之配套的MessageQueue。
有了Looper之后,创建了Handler子类的实例,重写handlerMessage()方法,该方法负责处理来自其他线程的消息。
调用Looper的Loop()方法Looper。
异步任务AsyncTask(转载的)
一、解决新线程无法更新UI组建问题的方案为了解决新线程不能更新UI组建的问题,Andorid提供了如下几种解决方案:
使用Handler实现线程之间的通信。
Activity.runOnUiThread(Runnable)。
View.post(Runnable)。
View.postDelayed(Runnable)。
二、ANR(Application Not Responding)异常
Android默认约定当UI线程阻塞超过20秒将会引发ANR(Application Not Responding)异常。但实际上,不要说20秒,即使是5秒甚至2秒,用户都会感到十分不爽。因此,没必要去记这个20秒的时间限度。总之,开发者必须牢记:不要在UI线程中执行一些耗时操作。
三、AsyncTask抽象类
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数:
Params:启动任务执行的输入参数的类型。
Progress:后台任务完成进度值的类型。
Result:后台执行任务完成后返回结果的类型。
四、AsyncTask的特点
更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可。
五、使用AsyncTask的步骤
1.创建AsyncTask的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,可将它指定为void。
2.根据需要,实现AsyncTask的如下方法:
doInBackground(Params …):后台线程将要完成的任务,可以调用publishProgress(Progress... values)方法更新任务执行进度。
onProgressUpdate(Progress... values):在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,就会触发该方法。
onPreExecute():执行后台耗时操作前被调用,通常用户完成一些初始化操作,比如在界面上显示进度条。
onPostExecute(Result result):当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground方法返回的值传给该方法。
3.调用AsyncTask子类的实例的execute(Params... params)开始执行耗时任务。
六、使用AsyncTask时必须遵守的规则
必须在UI线程中创建AsyncTask的实例。
必须在UI线程中调用AsyncTask的execute()方法。
AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params... params)、onProgressUpdate(Progress... values)方法,不应该由程序员代码调用,而是由Android系统负责调用。
每个AsyncTask只能被执行一次,多次调用将会引发异常。
相关文章推荐
- android 抓取wifi网卡的数据包
- android hwcomposer
- android apk签名和包名
- android开源项目
- ListView 禁止Item被点击
- Android M 新的运行时权限开发者需要知道的一切
- BroadcastReceiver总结
- android EditText设置
- 配置AndroidStudio
- Android - "cause failed to find target android-14" 问题
- Android 5.1 SurfaceFlinger VSYNC详解
- 安卓统一添加activity切换动画
- Android - 点击可以转动的自定义右下角浮动FABImageButton按钮
- android-studio 安装gradle
- 解决Android Studio的adb not response。。。错误
- android 01
- Android 功能代码总结
- Android环境的搭建及Android Studio的安装
- Android 横向二级ListView列表
- 细致的学习了一遍Android Material Design,简单做下笔记