当我们启动一个App的时刻,Android体系会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread。平日一个应用的所有组件都运行在章一?Process中,当然,你可以经由过程修改四大年夜组件在Manifest.xml中的代码块(<activity><service><provider><receiver>)中的android:process属性指定其运行在不合的process中。当一个组件在启动的时刻,如不雅该process已经存在了,那么该组件就直接经由过程这个process被启动起来,并且运行在这个process的UI Thread中。
UI Thread中运行着很多重要的逻辑,如体系事宜处理,用户输入事宜处理,UI绘制,Service,Alarm等,如下图:
UI Thread包含的逻辑
而我们编写的代码则是穿插在这些逻辑中心,比如对用户触摸事宜的检测和响应,对用户输入的处理,自定义View的绘制等。如不雅我们插入的代码比价耗时,如收集请求或数据库攫取,就会壅塞UI线程其他逻辑的履行,大年夜而导致界面卡顿。如不雅卡立时光跨越5秒,体系就会报ANR缺点。所以,如不雅要履行耗时的操作,我们须要另起线程履行。
在新线程履行完耗时的逻辑后,往往须要将结不雅反馈给界面,进行UI更新。Android的UI toolkit不是线程安然的,不克不及在非UI线程进行UI的更新,所有对界面的更新必须在UI线程进行。
Android供给了四种常用的操作多线程的方法,分别是:
1. Handler+Thread
2. AsyncTask
4. IntentService
下面分布对四种方法进话旧绍。
Handler+Thread
Android主线程包含一个消息队列(MessageQueue),该消息队列琅绫擎可以存入一系列的Message或Runnable对象。经由过程一个Handler你可以往这个消息队列发送Message或者Runnable对象,并且处理这些对象。每次你新创建一个Handle对象,它会绑定于创建它的线程(也就是UI线程)以及该线程的消息队列,大年夜这时起,这个handler就会开端把Message或Runnable对象传递到消息队列中,并在它们出队列的时刻履行它们。
Handler Thread道理图
Handler可以把一个Message对象或者Runnable对象压入到消息队列中,进而在UI线程中获取Message或者履行Runnable对象,Handler把压入消息队列有两类方法,Post和sendMessage:
Post方法:
Post许可把一个Runnable对象入队到消息队列中。它的办法有:
post(Runnable)/postAtTime(Runnable,long)/postDelayed(Runnable,long)
对于Handler的Post方法来说,它会传递一个Runnable对象到消息队列中,在这个Runnable对象中,重写run()办法。一般在这个run()办法中写入须要在UI线程上的操作。
2. 可以经由过程cancel办法撤消还没履行完的AsyncTask
handler post用法
sendMessage许可把一个包含消息数据的Message对象压入到消息队列中。它的办法有:sendEmptyMessage(int)/sendMessage(Message)/sendMessageAtTime(Message,long)/sendMessageDelayed(Message,long)
Handler如不雅应用sendMessage的方法把消息入队到消息队列中,须要传递一个Message对象,而在Handler中,须要重写handleMessage()办法,用于获取工作线程传递过来的消息,此办法运行在UI线程上。Message是一个final类,所以弗成被持续。
handler定义
handler sendMessage用法
优缺点
1. Handler用法简单清楚明了,可以将多个异步义务更新UI的代码放在一路,清楚清楚明了
实用范围
1.多个异步义务的更新UI
AsyncTask是android供给的轻量级的异步类,可以直接持续AsyncTask,在类中实现异步操作,并供给接口反馈当前异步履行的程度(可以经由过程接话柄现UI进度更新),最后反馈履行的结不雅给UI主线程。
AsyncTask经由过程一个壅塞队列BlockingQuery<Runnable>存储待履行的义务,应用静态线程池THREAD_POOL_EXECUTOR供给必定命量的线程,默认128个。在Android 3.0以前,默认采取的是并行义务履行器,3.0今后改成了默认采取串行义务履行器,经由过程静态串行义务履行器SERIAL_EXECUTOR控制义务串行履行,轮回掏出义务交给THREAD_POOL_EXECUTOR中的线程履行,履行完一个,再履行下一?。
用法举例:
- class DownloadTask extends AsyncTask<Integer, Integer, String>{
- // AsyncTask<Params, Progress, Result>
- //后面尖括号内分别是参数(例子里是线程歇息时光),进度(publishProgress用到),返回值类型
- @Override
- protected void onPreExecute() {
- //第一个履行办法
- super.onPreExecute();
推荐阅读
应用分层可能仍然是有些小众的技巧,但因其用处广泛获得了人们的存眷。因为应用分层许可一些IT治理人员精确地定位到须要应用特定应用的用户并直接向他们交付应用。因为这一新兴技巧仍然在>>>详细阅读
本文标题:Android多线程的四种方式
地址:http://www.17bianji.com/lsqh/34818.html
1/2 1