高德天气应用开发之九:android ThreadPoolExecutor线程池 封装及使用

版权声明:本文为博主原创文章,未经允许不得转载,如有问题,欢迎指正,谢谢! https://blog.csdn.net/cbk861110/article/details/86667101

【版权说明】

1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564

2. 项目源码&框架说明&技术更新实现 请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!

--------------------- 

基于MVVM框架的高德天气APP:


功能点实现说明:

  • 线程管理功能:封装ThreadPoolExecutor,并发处理耗时请求,改善性能体验;

一、 技术背景:

1. 添加线程池管理,统一管理应用的异步task需求,改善整个应用的线程调度性能;

2. 线程池管理机制,xUtils框架中有嵌套支持代优先级的task,可移步参考学习;

3. 版权说明:部分代码参照网络资源,如有真实原始出处,请告知,以便后续添加版权备注,谢谢!

二、 技术实现:

1. 线程池代理类,封装ThreadPoolExecutor的技术细节,便于用户使用;

/**
 * 线程池代理类
 */
public static class ThreadPoolProxy {
    /**
     * para1:corePoolSize核心线程池大小
     * 如果设置allowCoreThreadTimeOut为false的情况下:
     * 即使当线程池中的线程处于空闲状态,这些线程也不会被线程池中移除。
     * 如果设置了allowCoreThreadTimeOut为true,
     * 那么当核心线程在空闲了一段时间后依旧没有用于工作,那么将会从线程池中移除。
     * 注意:(allowCoreThreadTimeOut默认为false,通常情况下也无需做修改)
     */
    private final int mCorePoolSize;

    /**
     * para2:maximumPoolSize:线程池中所允许创建最大线程数量
     */
    private final int mMaximumPoolSize;

    /**
     * para3:keepAliveTime:当线程池中的线程数量大于核心线程数,
     * 如果这些多出的线程在经过了keepAliveTime时间后,
     * 依然处于空闲状态,那么这些多出的空闲线程将会被结束其生命周期。
     */
    private final long mKeepAliveTime;

    /**
     * para4:unit:keepAliveTime的时间单位
     */
    private final TimeUnit unit = TimeUnit.MILLISECONDS;

    /**
     * para5:workQueue线程池的缓存队列(阻塞队列)
     * 提交的任务将被存储在workQueue进行缓冲。
     * 该队列只能存放通过execute方法提交的Runnable任务。
     * <p>
     * type1:ArrayBlockingQueue:  FIFO,一个由数组结构组成的有界阻塞队列。
     * type2:LinkedBlockingQueue:  FIFO, 一个由链表结构组成的有界阻塞队列。
     * type3:PriorityBlockingQueue:  FIFO,一个支持优先级排序的无界阻塞队列。
     * <p>
     * ?DealyQueue:一个使用优先级队列实现的无界阻塞队列。
     * ?SynchronousQueue:一个不存储元素的阻塞队列。
     * ?LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
     * ?LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
     */
    private final BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(4);

    /**
     * para6:threadFactory:线程池中用于创建线程的工厂
     * 在这里使用线程工厂的目的也是为了解耦,将创建的实现细节通过工厂进行封装,
     * 而不是直接将创建的方式固化在ThreadPoolExecutor本身的代码中。
     * Thread newThread(Runnable r)
     */
    private final ThreadFactory threadFactory = Executors.defaultThreadFactory();//线程工厂

    /**
     * para7:RejectedExecutionHandler:线程池对拒绝任务的处理策略.
     * 当线程池中的线程数量达到最大并且阻塞队列也已经满了无法再添加任务时,线程池所采取的处理策略。
     * <p>
     * type1:ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
     * type2:ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
     * type3:ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
     * type4:ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
     */
    private final RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();

    private ThreadPoolExecutor mPool;

    public ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long keepAliveTime) {
        this.mCorePoolSize = corePoolSize;
        this.mMaximumPoolSize = maximumPoolSize;
        this.mKeepAliveTime = keepAliveTime;
    }

    private void initPool() {
        if (mPool == null || mPool.isShutdown()) {
            mPool = new ThreadPoolExecutor(
                    mCorePoolSize,//para1:核心线程池大小
                    mMaximumPoolSize,//para2:最大线程池大小
                    mKeepAliveTime,//para3:保持存活的时间
                    unit,//para4:保持存活時間单位
                    workQueue,//para5:线程池的缓存队列
                    threadFactory,//para6:线程工厂
                    handler);//para7:异常捕获器
        }
    }

    /**
     * 执行任务
     */
    public void execute(Runnable task) {
        initPool();
        mPool.execute(task);
    }

    /**
     * 提交任务?
     */
    public Future<?> submit(Runnable task) {
        initPool();
        return mPool.submit(task);
    }

    /**
     * 取消任务
     */
    public void remove(Runnable task) {
        if (mPool != null && !mPool.isShutdown()) {
            mPool.getQueue().remove(task);
        }
    }
}

2. ThreadPoolProxy管理类,管理不同的线程管理类ThreadPoolManager.java:

public class ThreadPoolManager {
    //普通线程池
    private static ThreadPoolProxy mNormalPool =
            new ThreadPoolProxy(1, 3, 5 * 1000);
    //下载专用线程池
    private static ThreadPoolProxy mDownloadPool =
            new ThreadPoolProxy(3, 3, 5 * 1000);

    public static ThreadPoolProxy getNormalPool() {
        return mNormalPool;
    }

    public static ThreadPoolProxy getDownloadPool() {
        return mDownloadPool;
    }

3. 线程池的使用:

public void startNormalTask(Runnable task) {
    ThreadPoolManager.getNormalPool().execute(task);
}

public void startDownloadTask(Runnable task) {
    ThreadPoolManager.getDownloadPool().execute(task);
}

public void removeDownloadTask(Runnable task) {
    ThreadPoolManager.getDownloadPool().remove(task);//移除任务(停止线程池任务执行)
}

-------------------------------------------

文章目录(未完,待续):

一:android 应用子功能及移动框架总述 https://blog.csdn.net/cbk861110/article/details/86665564

二:android 高德天气API说明及城市天气查询实现 https://blog.csdn.net/cbk861110/article/details/86665655

三:android 自定义控件实现(ActionBar + PageIndicatorView) https://blog.csdn.net/cbk861110/article/details/86665790

四:android ViewPager实现左右页面滑动切换 https://blog.csdn.net/cbk861110/article/details/86665964

五:android应用权限动态申请 https://blog.csdn.net/cbk861110/article/details/86666321

六:android RecyclerView 封装及使用 https://blog.csdn.net/cbk861110/article/details/86666392

七:android Xutils3文件下载实现(高德天气城市配置) https://blog.csdn.net/cbk861110/article/details/86666573

八:android DiskLruCache 磁盘缓存 封装和使用 https://blog.csdn.net/cbk861110/article/details/86666664

九:android ThreadPoolExecutor线程池 封装及使用  https://blog.csdn.net/cbk861110/article/details/86667101

十:android 天气网络请求框架(retrofit2&okhttp3&Gson) 封装及使用  https://blog.csdn.net/cbk861110/article/details/86667375

十一:android RxAndroid(响应式编程) 异步网络请求实现 https://blog.csdn.net/cbk861110/article/details/86669178

十二:android DataBinding 数据和UI双向绑定实现 https://blog.csdn.net/cbk861110/article/details/86669708

十三:android room数据库 天气数据读写实现 https://blog.csdn.net/cbk861110/article/details/86670354

十四:android LiveData 使用方法(实现城市天气自动刷新) https://blog.csdn.net/cbk861110/article/details/86670531

十五:android ViewModel 使用方法 https://blog.csdn.net/cbk861110/article/details/86670703

十六:android 集成友盟消息推送机制(U-Push) https://blog.csdn.net/cbk861110/article/details/86683849

--------------------- 

【版权说明】

1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564

2. 项目源码&框架说明&技术更新实现 请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!

猜你喜欢

转载自blog.csdn.net/cbk861110/article/details/86667101