从这一部分我们开始学习Android的多线程,在这之前要搞清楚两个概念,进程和线程。
Android启动一个应用程序时,若该应用程序无其他组件运行,那么系统会为这个应用程序启动一个新的linux进程,并在这个进程中默认启动一个UI线程(主线程)。默认情况下,同一应用程序的所有组件都在同一进程的主线程中运行。如果应用程序组件启动,并且已经存在该应用程序的进程(因为应用程序中的其它组件已经启动),则组件将在该进程中启动,并使用相同的主线程。但是,您可以通过设置让应用程序中的不同组件分别在不同的进程中运行,并且可以为任何进程创建其它线程。接下来详细讲述进程和线程。
进程(Process)
每个App在启动前必须先创建一个进程,该进程是由Zygote fork出来的,进程具有独立的资源空间,用于承载App上运行的各种Activity/Service等组件。大多数情况一个App就运行在一个进程中,除非在AndroidManifest.xml中配置Android:process属性,或通过native代码fork进程。
线程
默认每个Android应用程序只会有一个线程(UI线程,即主线程),主线程负责该应用程序UI界面的显示、更新、控件交互等等,因此一些耗时操作(网络访问、下载操作、查询数据库等等)不可以放在主线程中进行,以免阻塞主线程。
ps:Android规定,只有在UI线程中才能进行UI的更新操作。
既然Android只能在UI线程中操作UI控件,而且不能在主线程中进行耗时操作,那么问题就来了,如果我们访问网络获取数据后需要在UI上进行展示,那么我们要怎么做呢?创建一个子线程访问网络,在数据获取完成中,怎样通知主线程进行UI更新呢,这就涉及到我们要讲的多线程通信了。
多线程通信
要进行多线程通信,Android中有这样几种方式:
- activity.runOnUiThread(Runnable runnable); Activity中的方法,在子线程中调用,可以在方法内进行UI的更新操作。
- view.post(Runnable runnable); view.postDelayed(Runnable runnable,long delayMillis); View中的方法,进行UI操作,或者延迟后进行UI操作
- BroadCast结合BroadCastReceiver 使用Android广播机制,在子线程中发出更新广播,在主线程中接收该广播并进行相应操作,使用的并不多,了解即可
- AsyncTask 使用AsyncTask开启异步任务在子线程中进行UI的更新**
- Handler 使用Handler进行线程间通信从而达到子线程更新UI的目的
接下来一段时间,我们就来详细讲解下使用Handler进行线程间通信的方法,以及Handler的原理,以及HanderTread和AsyncTask的使用等等,敬请期待~