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 遇到的需求

阅读更多

Android 多线程

01.Android中的线程

  • 主线程(有的也成UI线程)
    • 在Android当中, 当应用启动的时候,系统会给应用分配一个进程,顺便一提,大部分应用都是单进程的,不过也可以通过设置来使不同组件运行在不同的进程中,在创建进程的同时会创建一个线程,应用的大部分操作都会在这个线程中运行。所以称为主线程,同时所有的UI控件相关的操作也要求在这个线程中操作,所以也称为UI线程。
  • 为何会有子线程
    • 因为所有的UI控件的操作都在UI线程中执行,如果在UI线程中执行耗时操作,例如网络请求等,就会阻塞UI线程,导致系统报ANR(Application Not Response)错误。因此对于耗时操作需要创建工作线程来执行而不能直接在UI线程中执行。这样就需要在应用中使用多线程,但是Android提供的UI工具包并不是线程安全的,也就是说不能直接在工作线程中访问UI控件,否则会导致不能预测的问题, 因此需要额外的机制来进行线程交互,主要是让其他线程可以访问UI线程。
阅读更多

Android View 事件总结2

01.View滑动有哪些方法

  • View滑动有哪些方法?

    • layout:对View进行重新布局定位。在onTouchEvent()方法中获得控件滑动前后的偏移。然后通过layout方法重新设置。
    • offsetLeftAndRight和offsetTopAndBottom:系统提供上下/左右同时偏移的API。onTouchEvent()中调用
    • LayoutParams: 更改自身布局参数
    • scrollTo/scrollBy: 本质是移动View的内容,需要通过父容器的该方法来滑动当前View
阅读更多

Android View 事件总结1

01.Android事件分发机制

  • 简述Android的事件分发机制?
    • 事件分发顺序:Activty->ViewGroup->View
    • 主要方法:dispatchTouchEvent-分发事件、onInterceptTouchEvent-当前View是否拦截该事件、onTouchEvent-处理事件
    • 1.父View调用dispatchTouchEvent开启事件分发。
    • 2.父View调用onInterceptTouchEvent判断是否拦截该事件,一旦拦截后该事件的后续事件(如DOWN之后的MOVE和UP)都直接拦截,不会再进行判断。
阅读更多

Android View事件机制

1.事件机制代码解释说明

1.1 触摸事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 触摸事件
* 如果返回结果为false表示不消费该事件,并且也不会截获接下来的事件序列,事件会继续传递
* 如果返回为true表示当前View消费该事件,阻止事件继续传递
*
* 在这里要强调View的OnTouchListener。如果View设置了该监听,那么OnTouch()将会回调。
* 如果返回为true那么该View的OnTouchEvent将不会在执行 这是因为设置的OnTouchListener执行时的优先级要比onTouchEvent高。
* 优先级:OnTouchListener > onTouchEvent > onClickListener
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("onEvent","MyLinearLayout onTouchEvent");
return super.onTouchEvent(event);
}
阅读更多