Android Activity、Window、View 三者关系

01.Window,View,子Window

  • 弹窗有哪些类型
    • 使用子窗口:在 Android 进程内,我们可以直接使用类型为子窗口类型的窗口。在 Android 代码中的直接应用是 PopupWindow 或者是 Dialog 。这当然可以,不过这种窗口依赖于它的宿主窗口,它可用的条件是你的宿主窗口可用
    • 采用View系统:使用 View 系统去模拟一个窗口行为,且能更加快速的实现动画效果,比如SnackBar 就是采用这套方案
阅读更多

Android 线程池封装库

0.前言介绍

  • 轻量级线程池封装库,支持线程执行过程中状态回调监测(包含成功,失败,异常等多种状态);支持创建异步任务,并且可以设置线程的名称,延迟执行时间,线程优先级,回调callback等;可以根据自己需要创建自己需要的线程池,一共有四种;线程异常时,可以打印异常日志,避免崩溃。
  • 关于线程池,对于开发来说是十分重要,但是又有点难以理解或者运用。关于写线程池的博客网上已经有很多了,但是一般很少有看到的实际案例或者封装的库,许多博客也仅仅是介绍了线程池的概念,方法,或者部分源码分析,那么为了方便管理线程任务操作,所以才想结合实际案例是不是更容易理解线程池,更多可以参考代码。
阅读更多

Android 中几种进程

01.基础介绍

  • 在安卓系统中:当系统内存不足时,Android系统将根据进程的优先级选择杀死一些不太重要的进程,优先级低的先杀死。进程优先级从高到低如下。

02.前台进程

  • 处于正在与用户交互的activity
  • 与前台activity绑定的service
  • 调用了startForeground()方法的service
阅读更多

Android 线程池案例测试

1.ThreadPoolExecutor类介绍

1.1 构造函数

  • ExecutorService是最初的线程池接口,ThreadPoolExecutor类是对线程池的具体实现,它通过构造方法来配置线程池的参数
1
2
3
4
5
6
7
8
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
阅读更多

Android IntentService 源码分析

01.整体源码展示及归纳

  • IntentService实际上内部实例化了一个HandlerThread,并且封装了一个Handler,所以他的工作流程通过上面的源码,分析如下:

    • 创建一个HandlerThread,开启HandlerThread来创建Looper
    • 创建一个Handler,传入Looper,从而在子线程实例化Handler
    • 在onStartCommand中获取到的Intent作为消息的obj发送出去
    • 然后在onHandleIntent中处理这个消息,注意此时是在子线程
阅读更多

Android 线程池基础

01.实际开发问题

  • 在我们的开发中经常会使用到多线程。例如在Android中,由于主线程的诸多限制,像网络请求等一些耗时的操作我们必须在子线程中运行。
  • 我们往往会通过new Thread来开启一个子线程,待子线程操作完成以后通过Handler切换到主线程中运行。这么以来我们无法管理我们所创建的子线程,并且无限制的创建子线程,它们相互之间竞争,很有可能由于占用过多资源而导致死机或者OOM。所以在Java中为我们提供了线程池来管理我们所创建的线程。

02.线程池的优势

阅读更多

Android IntentService 使用

01.使用步骤

  • 步骤1:定义IntentService的子类:传入线程名称、复写onHandleIntent()方法
  • 步骤2:在Manifest.xml中注册服务
  • 步骤3:在Activity中开启Service服务

02.具体案例

  • 步骤1:定义IntentService的子类:传入线程名称、复写onHandleIntent()方法

阅读更多

Android AsyncTask 缺陷问题

0.1 AsyncTask对应线程池

  • Asynctask对应的线程池ThreadPoolExecutr都是进程范围内共享的,都是static的,所以是Asynctask控制着进程范围内所有的子类实例。由于这个限制的存在,当使用默认线程池时,如果线程数超过线程池的最大容量,线程池就会爆掉(3.0后默认串行执行,不会出现个问题)。针对这种情况,可以尝试自定义线程池,配合Asynctask使用。
  • 关于默认线程池:
    • AsyncTask里面线程池是一个核心线程数为CPU + 1,最大线程数为CPU * 2 + 1,工作队列长度为128的线程池,线程等待队列的最大等待数为28,但是可以自定义线程池。线程池是由AsyncTask来处理的,线程池允许tasks并行运行,需要注意的是并发情况下数据的一致性问题,新数据可能会被老数据覆盖掉类似volatile变量。所以希望tasks能够串行运行的话,使用SERIAL_EXECUTOR。
阅读更多

Android AsyncTask 介绍

01.先看下AsyncTask用法

  • AsyncTask的工作流程

    • 轻量级别的异步任务类,内部封装了线程池、线程和 Handler ,主要的流程:
      • 耗时操作之前准备 (Main Thread)
      • 处理耗时操作 & 向主线程发送更新进度的 message(Work Thread)
      • 获取进度的回调并处理 (Work Thread)
      • 耗时操作结束的处理 (Main Thread)
阅读更多

Android 频繁创建 Thread 缺点

01.遇到的问题分析

1.1 遇到的问题有哪些?

  • 继承Thread,或者实现接口Runnable来开启一个子线程,无法准确地知道线程什么时候执行完成并获得到线程执行完成后返回的结果
  • 当线程出现异常的时候,如何避免导致崩溃问题?

1.2 遇到的需求

阅读更多