Android线程学习总结

Android进程线程学习总结

  1. Android程序启动时,Android会分配一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。
  2. 可以在manifest中设置组件在其他进程中。

Android线程的分类

  • 前台进程

    1. 这个进程运行着一个正在和用户交互的Activity(这个Activity的onResume()方法被调用)。

    2. 这个进程里有绑定到当前正在和用户交互的确Activity的一个service。

    3. 这个进程里有一个service对象,这个service对象正在执行一个它的生命周期的回调函数(onCreate(), onStart(), onDestroy())

    4. 这个进程里有一个正在的onReceive()方法的BroadCastReiver对象。

  • 可见进程

    1. 这个进程中含有一个不位于前台的Activity,但是仍然对用户是可见的(这个Activity的onPause()方法被调用),这是很可能发生的,例如,如果前台Activity是一个对话框的话,就会允许在它后面看到前一个Activity。

    2. 这个进程里有一个绑定到一个可见的Activity的Service。

  • 服务进程
    运行着一个通过startService() 方法启动的service,这个service不属于上面提到的2种更高重要性的。service所在的进程虽然对用户不是直接可见的,但是他们执行了用户非常关注的任务(比如播放mp3,从网络下载数据)。只要前台进程和可见进程有足够的内存,系统不会回收他们。
  • 后台进程
    运行着一个对用户不可见的activity(调用过 onStop() 方法).这些进程对用户体验没有直接的影响,可以在服务进程、可见进程、前台进 程需要内存的时候回收。通常,系统中会有很多不可见进程在运行,他们被保存在LRU (least recently used) 列表中,以便内存不足的时候被第一时间回收。如果一个activity正 确的执行了它的生命周期,关闭这个进程对于用户体验没有太大的影响。
  • 空进程
    未运行任何程序组件。运行这些进程的唯一原因是作为一个缓存,缩短下次程序需要重新使用的启动时间。系统经常中止这些进程,这样可以调节程序缓存和系统缓存的平衡。
    Android 对进程的重要性评级的时候,选取它最高的级别。例如,如果一个进程含有一个service和一个可视activity,进程将被归入一个可视进程而不是service进程。

单线程模型

Android UI线程是一个单线程,也就是只有一个线程可以调用更新UI方法。这是因为为了性能考虑,UI线程是线程不安全的。所以使用单线程控制UI更新。

为了避免拖住GUI,一些较费时的对象应该交给独立的线程去执行。如果幕后的线程来执行UI对象,Android就会发出错误讯息 CalledFromWrongThreadException。以后遇到这样的异常抛出时就要知道怎么回事了!
在单线程模型下,如果子线程要更新UI,可以使用Handler或者AsyncTask提交消息给UI线程完成异步更新。

  • Handler
    Android线程学习总结_第1张图片

    1. 一个线程只能有一个Looper,该Looper也使得该线程成为Looper线程。一个Looper内部都有一个MessageQueue。
    2. Handler负责在其他任意线程发送消息,以及在与Handler关联的线程(即创建handler的线程)处理消息(异步)。默认Handler会关联到创建该Handler的线程,也会关联该线程的Looper。
    3. Android子线程更新UI线程的方式:activity(主线程)创建handler并将其引用传递给子线程,子线程完成任务后用handler发送消息(message或runnable)给主线程,主线程Looper取出该消息并发送给handler执行。
    4. Handler处理完该Message (update UI) 后,Looper则设置该Message为NULL,以便回收。
  • AsyncTask
    一个简单地异步任务方法。只需要在UI线程中实例化一个AsyncTask,并执行execute方法。然后在以下方法中执行UI更新即可:

    1. onPreExecute() 开始执行前的准备工作;
    2. doInBackground(Params…) 开始执行后台处理,可以调用publishProgress方法来更新实时的任务进度;
    3. onProgressUpdate(Progress…) 在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
    4. onPostExecute(Result) 执行完成后的操作,传送结果给UI 线程。

handler与AsyncTask优劣

  • handler

    1. 结构清晰
    2. 容易处理多个后台任务
    3. 缺点:消息队列可能阻塞或其他原因导致消息不能执行
  • AsyncTask

    1. 简单、快捷
    2. 过程可控
    3. 缺点:不适于多个异步操作

结束进程


  1. public void restartPackage (String packageName)(2.2之前)、manager.killBackgroundProcesses(getPackageName()(2.2之后)
  2. android.os.Process.killProcess(pid)
  3. System.exit(int code)
  4. 利用反射调用forceStopPackage来结束进程

需要注意的是: android.os.Process.killProcess(pid) 和 System.exit(int code)会导致进程非正常退出,进程退出时不会去执行Activity的onPause、onStop和onDestroy方法,那么进程很有可能错过了保存数据的机会。因此,这两个方法最好使用在出现异常的时候!大家需要注意其使用方法。

参考来源

[1] android进程与线程基础知识
[2] android的消息处理机制(图+源码分析)——Looper,Handler,Message

你可能感兴趣的:(android)