• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

Android多线程的四种方法

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0822/612.html

 
当我们企业培训启动一个App的时候,Android体系会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread。平时一个运用的所有组件都运转在这一个Process中,固然,你可以通过点窜四大组件在Manifest.xml中的代码块()中的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
 
3. ThreadPoolExecutor
 
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线程上的操纵。
 
 
handler post用法
 
sendMessage:
 
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的代码放在一路,清楚清晰
 
2. 处分单个异步使命代码略显多
 
适合局限
 
1. 多个异步使命的更新UI
 
AsyncTask
 
AsyncTask是android提供的轻量级的异步类,可以干脆秉承AsyncTask,在类中实现异步操纵,并提供接口反应目前异步执行的程度(可以通过接话柄现UI进度更新),非常后反应执行的后果给UI主线程。
 
AsyncTask通过一个壅闭队列BlockingQuery存储待执行的使命,行使静态线程池THREAD_POOL_EXECUTOR提供必然数目的线程,默认128个。在Android 3.0过去,默认采取的是并行使命执行器,3.0以后改成了默认接纳串行使命执行器,通过静态串行使命执行器SERIAL_EXECUTOR掌握使命串行执行,轮回取出使命交给THREAD_POOL_EXECUTOR中的线程执行,执行完一个,再执行下一个。
 
用法举例:
 
classDownloadTaskextendsAsyncTask{// AsyncTask//背面尖括号内分别是参数(例子里是线程苏息时间),进度(publishProgress用到),回笼值范例@OverrideprotectedvoidonPreExecute(){//第一个执行要领super.onPreExecute();    }@OverrideprotectedStringdoInBackground(Integer... params){//第二个执行要领,onPreExecute()执行完后执行for(inti=0;i<=100;i++){            publishProgress(i);try{                Thread.sleep(params[0]);            }catch(InterruptedException e) {                e.printStackTrace();            }        }return"执行完毕";    }@OverrideprotectedvoidonProgressUpdate(Integer... progress){//这个函数在doInBackground挪用publishProgress时触发,固然挪用时惟有一个参数//不过这里取到的是一个数组,以是要用progesss[0]来取值//第n个参数就用progress[n]来取值tv.setText(progress[0]+"%");super.onProgressUpdate(progress);    }@OverrideprotectedvoidonPostExecute(String result){//doInBackground回笼时触发,换句话说,即是doInBackground执行完后触发//这里的result即是上头doInBackground执行后的回笼值,以是这里是"执行完毕"setTitle(result);super.onPostExecute(result);    }}
 
优坏处
 
1. 处分单个异步使命简单,可以获取到异步使命的进度
 
2. 可以通过cancel要领作废还没执行完的AsyncTask
 
3. 处分多个异步使命代码显得较多
 
适合局限
 
1. 单个异步使命的处分
 
ThreadPoolExecutor
 
ThreadPoolExecutor提供了一组线程池,可以经管多个线程并行执行。如许一方面削减了每个并行使命单独确立线程的开支,另一方面可以经管多个并发线程的大众资源,从而进步了多线程的服从。以是ThreadPoolExecutor对照适合一组使命的执行。Executors行使厂家模式对ThreadPoolExecutor进行了封装,应用起来加倍利便。
 
 
ThreadPoolExecutor
 
Executors提供了四种建立ExecutorService的要领,他们的应用场景如下:
 
1.Executors.newFixedThreadPool()  建立一个定长的线程池,每提交一个使命就建立一个线程,直抵达到池的非常大长度,这时线程池会保持长度不再变更2.Executors.newCachedThreadPool()  建立一个可缓存的线程池,要是目前线程池的长度超过了处分的必要时,它可以天真的接管空闲的线程,当必要增加时,    它可以天真的增加新的线程,而不会对池的长度作任何限制3.Executors.newScheduledThreadPool()  建立一个定长的线程池,并且支持按时的以及周期性的使命执行,相似于Timer4.Executors.newSingleThreadExecutor()  建立一个单线程化的executor,它只建立唯一的worker线程来执行使命
 
适合常州微信公众平台局限
 
1. 批处分使命
 
IntentService
 
IntentService秉承自Service,是一个经过包装的轻量级的Service,用来汲取并处分通过Intent传递的异步要求。客户端通过挪用startService(Intent)启动一个IntentService,行使一个work线程顺次处分挨次过来的要求,处分实现后自动结束Service。
 
特色
 
1. 一个可以处分异步使命的简单Service

上篇:上一篇:android自顶菜单
下篇:下一篇:Android底部导航BottomNavigationBar