闲聊 Android 异步任务

在 Android 中有主线程和子线程,主线程只有一个,子线程可以有多个,当有多个子线程时就是多线程了。多线程属于异步处理任务技术,该技术主要是为了提高应用效率问题。

线程?
线程是程序执行的最小单元。

多线程?
多线程就是多个线程一起执行。
例如:我们使用微信聊天的同时还能继续播放着公众号文章中的音频。

多进程?
进程是程序的基本执行实体。我们手机上的每个 App 都是一个进程。

在 Android 上是如何开启线程的呢?我了解的有下面两种方式
方式1:继承 Tread
方式2:实现 Runable 接口

推荐使用 方式2 来实现,继承在面向对象中是用来拓展新功能,显然这里不是拓展新功能。

伪代码如下:

public class MyRunnable implements Runnable{
  @Override
  public void run(){
    // 实现具体逻辑  
  }
}

// 使用
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();

Android 中的处理异步处理任务的方式还有以下几种:

  • Handler
    主要用来发送消息和接收消息,发送消息通过post方法实现,接收消息是通过dispatchMessage方法实现。

它的底层实现需要 MessageQueue 和 Looper的支持。主要流程是 Looper 通过无限循环去查找 MessageQueue 中是否有消息,有的话就处理消息,没有则一直待着。

**线程是由生命周期的,当线程执行完成后,线程生命周期便该终止了,线程退出。**而对于主线程,我们是绝不希望会被运行一段时间,自己就退出,那么如何保证能一直存活呢?简单做法就是可执行代码是能一直执行下去的,死循环便能保证不会被退出

  • HandlerThread
    它继承了 Thread,内部集成了 Looper 和 MessageQueue的线程,是一种具有消息循环的线程,在它的内部可以使用 Handler;

  • ntentService
    它是一个服务,系统对其进行封装,使其可以更方便的执行后台任务 IntentService 内部使用了 HandlerThread 来执行任务,当任务执行完成之后 IntentService 会自动退出。

从任务执行的角度来看, IntentService 更像是一种后台线程,但是 IntentService 又是一种服务,它不容易被系统杀死,所以可以保证任务能够一直执行。而如果只是后台进程,那么这个进程的优先级就会非常低,很容易被后台杀死。

  • Executors
    可以用于方便的创建线程池,Executors为Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable类提供了一些工具方法。

在操作系统中,线程是操作系统调度的最小的单元,同时线程又是一种受限制的系统资源,即线程是不可能无限制的产生,并且线程的创建和销毁都会有相应的开销,所以在 Android中为了避免线程的无限创建,因此有了线程池的概念,主要是通过 Executor 来派生特定类型的线程池,不同种类的线程池又具有各自的特性。

  • AsyncTask
    是在 Executor的基础上进行封装,它实现耗时任务移动到工作线程中执行,并提供方便的接口实现工作线程和主线程的通信。其底层用到了线程池,而 IntentService 和 HandlerThread 底层则直接调用了线程。AsyncTask 封装了线程池和Handler,其主要是为了开发者在子线程中更新 UI
Android AysncTask 从源码角度简单理解它的使用限制原因
Android IntentService 从源码角度分析和简单使用
Android 中的线程池简单理解

参考

《Android 开发艺术探索》
《Android 高级进阶》

你可能感兴趣的:(Android)