Message创建方式:new Message和obtainMessage的区别_android message new_饭小粒的博客-程序员秘密

技术标签: android内核  

1. 前言

创建Message对象的时候,有三种方式,分别为: 
1.Message msg = new Message(); 
2.Message msg2 = Message.obtain(); 
3.Message msg1 = handler1.obtainMessage(); 
这三种方式有什么区别呢?

 

2.使用方式

 

public class MainActivity extends Activity {

    private Handler handler1 = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            Toast.makeText(MainActivity.this, "hanlder1", Toast.LENGTH_SHORT).show();
            super.handleMessage(msg);
        }
    };
    ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread(new Runnable() {
            @Override
            public void run() {
//                Message msg = new Message();
//                Message msg2 = Message.obtain();
                Message msg1 = handler1.obtainMessage();
                msg1.arg1 = 1;
                handler1.sendMessage(msg1);
            }
        }).start();
    }
}

 

3.源码讲解

1)Message msg = new Message();这种就是直接初始化一个Message对象,没有什么特别的。 
2)Message msg2 = Message.obtain();

 

/**
     * Return a new Message instance from the global pool. Allows us to
     * avoid allocating new objects in many cases.
     */
    public static Message obtain() {
        synchronized (sPoolSync) {
            if (sPool != null) {
                Message m = sPool;
                sPool = m.next;
                m.next = null;
                m.flags = 0; // clear in-use flag
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }

从注释可以得知,从整个Messge池中返回一个新的Message实例,通过obtainMessage能避免重复Message创建对象。 
3)Message msg1 = handler1.obtainMessage();

 

public final Message obtainMessage()
    {
        return Message.obtain(this);
    }

 

public static Message obtain(Handler h) {
        Message m = obtain();
        m.target = h;

        return m;
    }

 

public static Message obtain() {
        synchronized (sPoolSync) {
            if (sPool != null) {
                Message m = sPool;
                sPool = m.next;
                m.next = null;
                m.flags = 0; // clear in-use flag
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }

可以看到,第二种跟第三种其实是一样的,都可以避免重复创建Message对象,所以建议用第二种或者第三种任何一个创建Message对象。 
详细的源码讲解请看下篇:源码角度讲解Android消息处理机制(Handler、Looper、MessageQueue与Message)
--------------------- 
作者:曹银飞 
来源:CSDN 
原文:https://blog.csdn.net/dfskhgalshgkajghljgh/article/details/52672115 
版权声明:本文为博主原创文章,转载请附上博文链接!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/feelinghappy/article/details/85859894

智能推荐

毕设课设基于Android的校园订餐APP开发(附源码)_安卓订餐系统源码_泛古玉的博客-程序员秘密

系统由商家侧 APP 和用户(学生)侧 APP 两大模块组成,商家 APP 面向食堂的各个商户,商户能够使用其进行菜品的上下架,同时远程接受订单与得到用户评价反馈;用户(学生)侧 APP 面向各位在食堂就餐的学生,学生可以使用其进行菜品预览、在线下单,能够看到餐品的全部评价,同时也能在消费后对菜品进行评价。............

AM-Softmax Loss_amsoftmax github_Peanut_范的博客-程序员秘密

《Additive Margin Softmax for Face Verification》2018,Feng Wang et al.引言:本文提出一个概念上简单且几何上可解释的目标函数:additive margin Softmax (AM-Softmax),用于深度人脸验证,使得人脸特征具有更大的类间距和更小的类内距。同时,本文强调和讨论了特征归一化的重要性。实验表明AM-Soft...

实现简单动态自动匹配输入的内容_动态输入匹配怎么做_AC_XXZ的博客-程序员秘密

用这两个控件分别实现这两个:package com.example.autocomplete;import android.app.Activity;import android.os.Bundle;import android.util.Log;import andr

Makefile.am文件详解_u012903992的博客-程序员秘密

原文:https://blog.csdn.net/u013485792/article/details/51355668Makefile.am是一种比Makefile更高层次的编译规则,可以和configure.in文件一起通过调用automake命令,生成Makefile.in文件,再调用./configure的时候,就将Makefile.in文件自动生成Makefile文件了。所以Makefile.am文件是比Makefile文件更高的抽象。下面我根据自己的工作中的一些应用,来讨论Makefil

C# 实现软件授权码的功能_private system.windows.forms.textbox textbox2_任玉腾的博客-程序员秘密

对于一个商业软件来说,授权码这个功能必不可少。我这里采用CPU序列号加硬盘标识来判断是否授权。完整代码如下:using Microsoft.Win32;using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;us...

51nod-1119 机器人走方格 V2_z岁月无声的博客-程序员秘密

 1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。Input第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 100000...

随便推点

压力 性能 测试 工具 ab (apache benchmark) jmeter_benchmark jmeter_conquer0715的博客-程序员秘密

快速开始ab参数很多,一般我们用 -c 和 -n 参数就可以了. 例如: ./ab -c 100 -n 10000 http://127.0.0.1/index.php 介绍ab(apache benchmark) —— apache自带的一个测试工具,一般把apache压力测试称为AB测试. ab工具的位置在apache的bin目录里,参数说明:Usage: ./ab

Redis集群和优化_走马川行雪的博客-程序员秘密

1、Redis介绍Redis服务器程序采用单进程模型(同一时刻只能处理一个请求)处理客户端请求 Redis基于内存并且支持多达六种数据类型 Redis是一款非常优秀的NoSQL数据库 Redis可以与Lua脚本结合爆发出强大的功能点2、Redis安装详见:https://www.runoob.com/redis/redis-install.html3、Redis之Java客户端...

三星android 8.0的变化,三星关于Android 8.0更新时间表出炉:Note 8本月更新_地理狗的博客-程序员秘密

上月,相信三星S8系列的用户已经先后收到Android 8.0的更新推送。那么,三星Note8的Android 8.0什么时候能跟上呢?其实,三星Note8的Android 8.0已经在计划中了。据外媒消息显示,三星土耳其方面已经在其官网公布了三星计划更新Android 8.0正式版的机型的具体推送时间,其中就包括三星Note8、S7、S7+等机型可获得升级。从三星土耳其官方网站上可以看到,最先吃...

STM32 USB 学习_stm32 usb拔出_yhl_sophia的博客-程序员秘密

USB硬件接口1、Type —— Type A(普通PC端)、Type B(USB设备的接口)、Type C(属于USB3.0)2、Mini —— Mini A、Mini B(数码相机、移动硬盘等移动设备)3、 Micro —— Micro A、MicroB(手机等移动设备),属于USB2.0USB模式1、USB HOST模式2、USB OTG U...

洛谷P1455 搭配购买_denge2160的博客-程序员秘密

1 //并查集+01背包 2 //用并查集把几件物品合为一件 3 #include<bits/stdc++.h> 4 using namespace std; 5 const int maxn=10005; 6 const int maxv=10005; 7 int n,m,v_tot,tot,v[maxn],w[maxn],dp[maxv];...

推荐文章

热门文章

相关标签