zoukankan      html  css  js  c++  java
  • Android开发艺术探索学习笔记(十一)

    第十一章  Android的线程和线程池

      从用途上来说,线程分为子线程和主线程,主线程主要处理和界面相关的事情,而子线程往往用于执行耗时的操作。AsyncTask,IntentService,HandlerThread都可以扮演线程的角色。

      AsyncTask封装了线程池和Handler,主要是为了方便开发者在主线程中更新UI。

      HandlerThread是一种具有消息循环的线程,在它的内部可以使用Handler。

      IntentService是一个服务,系统对其进行了封装,使其可以更方便的执行后台任务,IntentService内部采用了HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出,由于其优先级较高,不容易被系统杀死。

      11.1 主线程和子线程

      主线程-处理界面交互相关的逻辑,运行四大组件以及处理它们和用户的交互。

      子线程-执行耗时的任务,比如网络请求,IO操作等。(3.0开始网络访问不能在主线程中,否则NetworkOnMainThreadException)

      11.2 Android中的线程形态

        11.2.1 AsyncTask

        一种轻量级的异步任务类,在线城池中执行后台任务,然后把执行的君度和最终的结果传递给主线程并在主线程中更新 UI,不建议用于执行特别耗时的任务。

        类声明如下:

    public abstract class AsyncTask<Params,Progress,Result>

         Params:参数类型;

        Progress:后台任务执行进度类型;

        Result:后台任务的返回结果类型。

        以上参数如果不需要传递可以用Void代替。

        四个核心方法:

        (1)onPreExecute()——初始化的准备工作,主线程中执行;

        (2)doInBackground(Params...params)——执行异步任务,线程池中执行,执行过程中通过publishProgress方法更新任务进度,publishProgress方法会触发onProgressUpdate();

        (3)onProgressUpdate(Progress...values)——更新任务进度,主线程中执行。

        (4)onPostExecute(Result result)——异步任务返回结果,主线程执行。

        注意:...在java中表示参数不固定,数组型参数。

        执行异步任务通过以下方法:

    new MyAsyncTask().execute(url1,url2,url3);

         AsyncTask使用的限制条件:

        (1)AsyncTask的类必须在主线程中加载(默认);

        (2)AsyncTask对象必须在主线程中创建;

        (3)execute方法必须在主线程中调用;

        (4)不要直接调用四种核心方法;

        (5)一个AsyncTask对象只能执行一次,即只能调用一次execute方法,否则会报运行时异常。

        11.2.3 HandlerThread

        HandlerThread继承自Thread,是一种可以使用handler 的Thread,具体使用场景是IntentService。

        11.2.4 IntentService

        IntentService一种特殊的Service,封装了HandlerThread和Handler,用于执行后台耗时的任务,任务执行后会自动停止;比较适合执行一些高优先级的后台任务。

      11.3 Android中的线程池

      线程池的优点:

      (1)重用线程池中的线程可减少性能开销;

      (2)能有效控制线程池的最大并发数,避免大量线程之间因互相抢占系统资源而导致的阻塞现象。

      (3)能够对线程进行简单的管理,提供定时执行以及指定间隔循环执行等功能。

      Android 中的线程池都是直接或者间接通过配置ThreadPoolExecute来实现的。

      11.3.1 ThreadPoolExecute

      线程池的构造方法:

    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TileUnit unit,BlockingQueue<Runnable> workQueue,THreadFactory threadFactory)

      corePoolSize:核心线程数;

      maximumPoolSize:最大线程数;

      keepAliveTime:非核心线程闲置时的超时时长;

      unit:keepAliveTime的时间单位,如TimeUnit.MILLISECONDS(毫秒),TimeUnit.SECONDS(秒),TimeUnit.MINUTES(分钟)

      workQueue:线程池中的任务队列。

      threadFactory:线程工厂,用于为线程池创建新线程。

      11.3.2 线程池的分类

      (1)FixedThreadPool——只有核心线程;

      (2)CachedThreadPool——只有非核心线程,适合执行大量的耗时较少的任务;

      (3)ScheduledThreadPool——核心线程数量固定,非核心线程数量无限制,用于执行定时任务和具有固定周期的重复任务;

      (4)SingleThreadExecutor——只有一个核心线程,解决线程同步问题。

  • 相关阅读:
    What is the difference between the ways to implement inheritance in javascript.
    understand dojo/domReady!
    Using dijit/Destroyable to build safe Components
    Session Tracking Approaches
    difference between forward and sendredirect
    What is the DD in java web application
    棋牌游戏-后端架构(1)
    成为技术领导者笔记--领导的MOI模型
    最小表示法
    SGI STL rope
  • 原文地址:https://www.cnblogs.com/shiwei-bai/p/5197629.html
Copyright © 2011-2022 走看看