Android Looper 深度解析

01.Activity如何自动绑定Looper

  • 主线程如何自动调用Looper.prepare()

  • ActivityThread,并且在main方法中我们会看到主线程也是通过Looper方式来维持一个消息循环。那么这个死循环会不会导致应用卡死,即使不会的话,它会慢慢的消耗越来越多的资源吗?

    • 对于线程即是一段可执行的代码,当可执行代码执行完成后,线程生命周期便该终止了,线程退出。而对于主线程,我们是绝不希望会被运行一段时间,自己就退出,那么如何保证能一直存活呢?简单做法就是可执行代码是能一直执行下去的,死循环便能保证不会被退出。
阅读更多

Android Handler 深度解析

01.Handler构造方法

  • 首先看看构造方法

    • 可以看出在Handler的构造方法中,主要初始化了一下变量,并判断Handler对象的初始化不应再内部类,静态类,匿名类中,并且保存了当前线程中的Looper对象。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public Handler(Callback callback, boolean async) {
    if (FIND_POTENTIAL_LEAKS) {
    final Class<? extends Handler> klass = getClass();
    if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
    (klass.getModifiers() & Modifier.STATIC) == 0) {
    Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
    klass.getCanonicalName());
    }
    }

    mLooper = Looper.myLooper();
    if (mLooper == null) {
    throw new RuntimeException(
    "Can't create handler inside thread that has not called Looper.prepare()");
    }
    mQueue = mLooper.mQueue;
    mCallback = callback;
    mAsynchronous = async;
    }
阅读更多

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创建方式

阅读更多