Android 消息机制源码流程

01.Handler发送消息

  • Handler 发送消息的形式主要有以下几种形式,其最终调用的都是 sendMessageAtTime() 方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public final boolean sendMessage(Message msg){
    return sendMessageDelayed(msg, 0);
    }

    public final boolean post(Runnable r){
    return sendMessageDelayed(getPostMessage(r), 0);
    }

    public final boolean sendMessageDelayed(Message msg, long delayMillis){
    if (delayMillis < 0) {
    delayMillis = 0;
    }
    return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
    }
阅读更多

Android Handler 机制体系

01.Handler必备知识点

  • 作用:
    • 跨线程通信。当子线程中进行耗时操作后需要更新UI时,通过Handler将有关UI的操作切换到主线程中执行。
  • 四要素:
    • Message(消息):需要被传递的消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,最终由Handler处理。
    • MessageQueue(消息队列):用来存放Handler发送过来的消息,通过 Handler 发送的消息并非是立即执行的,需要存入一个消息队列中来依次执行,内部通过单链表的数据结构来维护消息列表,等待Looper的抽取。
阅读更多

Android Handler 基础使用

01.Handler常见使用方式

  • handler机制大家都比较熟悉呢。在子线程中发送消息,主线程接受到消息并且处理逻辑。如下所示

    • 一般handler的使用方式都是在主线程中定义Handler,然后在子线程中调用mHandler.sendXx()方法,这里有一个疑问可以在子线程中定义Handler吗?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    public class MainActivity extends AppCompatActivity {

    private TextView tv ;

    /**
    * 在主线程中定义Handler,并实现对应的handleMessage方法
    */
    public static Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
    if (msg.what == 101) {
    Log.i("MainActivity", "接收到handler消息...");
    }
    }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv = (TextView) findViewById(R.id.tv);
    tv.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    new Thread() {
    @Override
    public void run() {
    // 在子线程中发送异步消息
    mHandler.sendEmptyMessage(1);
    }
    }.start();
    }
    });
    }
    }
阅读更多

Android 主题 Theme 的使用总结

目录导向

  • 1.设置全屏【应用广泛】
    • 1.1 style设置
    • 1.2 直接设置
    • 1.3 代码设置
  • 2.Theme主题大全
  • 3.设置窗体透明度,昏暗度,背景模糊处理
    • 3.3 透明度
    • 3.2 昏暗度
    • 3.3 背景模糊

image

阅读更多

Android attr 属性介绍

attr属性的定义/读取/出错/使用

  • 1.1 自定义attr属性与读取

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /**
    * 初始化。
    *
    * @param context 上下文。
    * @param attributeSet 属性。
    */
    private void initialize(Context context, AttributeSet attributeSet) {
    mPaint.setAntiAlias(true);
    TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.CircleProgressbar);
    if (typedArray.hasValue(R.styleable.CircleProgressbar_circle_color)){
    inCircleColors = typedArray.getColorStateList(R.styleable.CircleProgressbar_circle_color);
    } else{
    inCircleColors = ColorStateList.valueOf(Color.TRANSPARENT);
    }
    circleColor = inCircleColors.getColorForState(getDrawableState(), Color.TRANSPARENT);
    typedArray.recycle();
    }
阅读更多

Android Style 样式汇总

目录介绍

  • 1.简单介绍
  • 2.样式的定义
  • 3.主题

1.简单介绍

  • 整合所有资源,定义成统一的样式。哪些该定义成统一的样式呢?举几个例子吧:
      1. 每个页面标题栏的标题基本会有一样的字体大小、颜色、对齐方式、内间距、外间距等,这就可以定义成样式;
阅读更多

Android Shape 自定义图形汇总

1.简单介绍

  • 一个应用,应该保持一套统一的样式,包括Button、EditText、ProgressBar、Toast、Checkbox等各种控件的样式,还包括控件间隔、文字大小和颜色、阴影等等。web的样用css来定义,而android的样式主要则是通过shape、selector、 layer-list、level-list、style、theme等组合实现。
  • 我将用一系列文章,循序渐进地讲解样式的每个方面该如何实现。第一个要讲的就是shape,最基础的形状定义工具。

2.shape可以自定义四种类型的形状,通过android:shape属性指定

阅读更多

Android Selector 选择器总结

1.selector简单介绍

  • 实际应用中,很多地方比如按钮Button、Tab、ListItem等都是不同状态有不同的展示形状。
    • 举个例子,一个按钮的背景,默认时是一个形状,按下时是一个形状,不可操作时又是另一个形状。
    • 有时候,不同状态下改变的不只是背景、图片等,文字颜色也会相应改变。而要处理这些不同状态下展示什么的问题,就要用selector来实现。

2.selector创建方式

阅读更多

Android 动画源码解析

1.Animation和Animator区别

  • 对于 Animation 动画:
    • 实现机制是,在每次进行绘图的时候,通过对整块画布的矩阵进行变换,从而实现一种视图坐标的移动,但实际上其在 View内部真实的坐标位置及其他相关属性始终恒定.
  • 对于 Animator 动画:
    • Animator动画的实现机制说起来其实更加简单一点,因为他其实只是计算动画开启之后,结束之前,到某个时间点得时候,某个属性应该有的值,然后通过回调接口去设置具体值,其实 Animator 内部并没有针对某个 view 进行刷新,来实现动画的行为,动画的实现是在设置具体值的时候,方法内部自行调取的类似 invalidate 之类的方法实现的.也就是说,使用 Animator ,内部的属性发生了变化
阅读更多

Android 加载json动画

01.如何解析json动画

  • 如下所示,代码很简单

  • 在布局中

    1
    2
    3
    4
    5
    6
    7
    <com.airbnb.lottie.LottieAnimationView
    android:id="@+id/lottie_view"
    android:layout_width="400dp"
    android:layout_height="400dp"
    app:lottie_fileName="loading.json"
    app:lottie_loop="true"
    app:lottie_autoPlay="true"/>
阅读更多