首页 > 代码库 > Android 线程

Android 线程

  1. 当应用启动,系统会创建一个主线程,也叫UI线程,系统对每个UI组件的调用事件都在UI线程中分发出去,而不会为每个UI单独建立线程,这种单线程模型有两个准则:
    • 不要阻塞UI线程
    • 不用再UI线程之外访问Android UI

  2. 下面方法可以将执行放在UI线程,但不常用
    • Activity.runOnUiThread(Runnable)
    • View.post(Runnable)
    • View.postDelayed(Runnable, long)

  3. Handler类的主要作用:
    • 在新启动的线程中发送消息,调用sendMessage系列函数
    • 在主线程中获取,处理消息,当新线程发送消息时,主线程会回调handleMessage方法进行处理

  4. 每个线程都有一个Looper对象,负责管理MessageQueue,不间断的从MessageQueue中取出消息分发给Handler来处理,注意UI线程中已经初始了一个Looper对象,程序直接创建Handler即可,自己启动的线程,必须自己去创建Looper对象并启动它,自定义线程使用Handler和Looper的过程如下:
    • 调用Looper.prepare() 创建一个Looper对象
    • 创建Handler对象并重写handleMessage方法
    • 调用Looper的loop方法来启动Looper
  5. 一个线程只能有一个Looper,但可以有多个Handler对象,每个Handler发送的消息由这个Handler本身处理。ActivityThread中定义了一个Handler,用于与ApplicationThread通信
  6. 异步任务AsyncTask,通常要实现AsyncTask的如下方法:
    • onPreExecute:执行异步任务之前的时候执行,并且在UI线程中执行,通常在这个方法里做一些UI控件的初始化的操作
    • doInBackground:在onPreExecute后执行,android会在后台的线程池中开启一个work thread来执行我们的方法,之后会把执行结果发送给onPostExecute方法
    • onProgressUpdate:在doInBackground方法中调用publishProgress方法更新任务进度时会触发该方法
    • execute:执行task

  7. 使用AsyncTask时必须遵守如下规则:
    • 必须在UI线程中初始化AsyncTask的实例
    • 必须在UI线程中调用AsyncTask的execute方法
    • AsyncTask的onPreExecute,onPostExecute,doInBackground,onProgressUpdate方法不能由程序员自己调用,而是由Android系统负责调用
    • 每个AsyncTask只能执行一次,多次调用将引发异常

Android 线程