Android中的线程
- 在Android开发中,请求网络数据,会是一项耗时的操作,而在主线程中是不能进行耗时操作的,因为主线程超过5秒就会报ANR,所以当进行耗时操作就要开启子线程,通过子线程来完成耗时的操作。
- Android中开启线程的方式有很多,比如:runOnUiThread,Thread+Handler,AyncTask等等
- 如果只是简简单单的更新UI,可以直接使用runOnUiThread,就可以了
- Thread+Handler
- 如果需要子线程去完成耗时的操作,从网络中请求数据,然后显示在界面上,就通过new Thread,在里面进行耗时操作,在主线程中创建一个handler,通过handler发送数据,在handler对象中通过handleMessage来更新UI。
- 使用Thread+Handler要比AsyncTask功能更强大一些。但是没有AsyncTask灵活
- AsyncTask
- AsyncTask 在主线程通过execute()开启任务;
- doInBackground方法里面就是运行子线程中的方法,在这个里面进行联网耗时的操作;
- onProgressUpdate,在调用publishProgress时,此方法被执行,直接将进度信息更新到UI组件上;
onPostExecute方法是后台操作完成之后才调用,在这里面可以取消进度条(更新UI)。
AsyncTask受局限的就是它只能运行一次,再运行的话,会报异常,因为在它的内部设置了三种状态:没运行,正在运行,运行结束。在里面做了一个判断,如果当前不是还没有运行,接下来使用switch,case了剩下的两种状态,均抛出异常。内部还有一个线程池,把Runable的子类传到它的execute()方法中。内部有一个handler,Message,在执行完DoInBackground方法后,通过handler发送消息,把数据传给了主线程,执行onPostExecute方法。
线程池,JDK自带线程池的实现类ThreadPoolExecutor
- 提升性能
- 防止内存过度消耗。控制活动线程的数量,防止并发线程过多。
- 里面接收的参数有核心线程数,最大线程数,线程池维护线程所允许的空闲时间,线程池维护线程所允许的空闲时间的单位,线程池所使用的缓冲队列;(线程池对拒绝任务的处理策略。。。)
之后的明天再补充吧