首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android精通之Handler讲解

Android精通之Handler讲解

作者头像
达达前端
发布于 2019-07-03 04:21:09
发布于 2019-07-03 04:21:09
51300
代码可运行
举报
文章被收录于专栏:达达前端达达前端
运行总次数:0
代码可运行

版权声明:未经博主允许不得转载

封面图

一:简介

软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and me, we are family !

二:重点

那么什么是Handler呢?为什么要使用Handler呢?如何去实现呢?我们要了解Handler的工作原理在学Handler中,我们要知道并学习Handler,Looper,MessageQueue,Message等知识点。

消息循环机制

Handler

1.Looper循环者

2.Message消息

3.MessageQueue消息队列(专门存放消息的)

一:在Handler学习中,主要了解Handler,Looper,MessageQueue,Message,Handler的作用将Message对象发送到MessageQueue中,Looper的作用像个发动机,从MessageQueue中取出数据交给Handler中的handleMessage方法。

Handler的方法以及使用

1.Handler.sendMessage()

2.Handler.post()

二:在onCreate中为主线程/UI线程,做一些轻量级的事情 主线程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//创建一个Handler
final Handler handler = new Handler(){
  @Override
  public void handleMessage(Message msg) {
     super.handleMessage(msg);

  /*
    * 接到子线程发出来的消息,处理
    * */
     //处理消息
    Log.i(TAG,"handleMessage:" + msg.what);

      if (msg.what==110){
        textView.setText("huang");
        }
     }
};

子线程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
* 有可能做大量耗时的操作
* 子线程
 * */
  new Thread(new Runnable() {
        @Override
        public void run() {
          try {
               Thread.sleep(10000);
              } catch (InterruptedException e) {
                e.printStackTrace();
          }

          /*
           * 通知UI更新
           * */
           handler.sendEmptyMessage(110); 
    }
}).start();

三: Handler public class Handler extends Object 导入android.os.Handler

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//子类
[AsyncQueryHandler][AsyncQueryHandler.WorkerHandler][HttpAuthHandler][SslErrorHandler]

处理程序: 处理Message与线程关联的Runnable对象MessageQueue,第一,安排将要执行的消息和可执行的程序;二,在不用的线程执行任务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
调度消息和实现
sendMessage(Message msg)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)

sendEmptyMessage(int)
post(Runnable)
postAtTime(Runnable,log)
postDelayed(Runnable,Object,log)
//有很多方法还是要查官方文档的好

SystemClock.uptimeMillis()为系统时间,给执行带来额外的延迟

这里了解一下源码里有
obtainMessage(参数)
what:int:要分配给返回的Message.what字段的值。
arg1:int:要分配给返回的Message.arg1字段的值。
arg2:int:要分配给返回的Message.arg2字段的值。

//
发送消息延迟sendMessageAtTime

四://Two

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {
//主线程
}

在子线程中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*
                * 有可能做大量耗时的操作
                * 子线程
                * */
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(10000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        /*
                        * 通知UI更新
                        * */
                    
                        Message message = Message.obtain();
                        message.what=1;
                        message.arg1=2;
                        message.arg2=3;
                        message.obj=MainActivity.this;
                        handler.sendMessage(message);

                        //定时任务
                        handler.sendMessageAtTime(message,SystemClock.uptimeMillis() + 5000);
                        handler.sendMessageDelayed(message,5000);

                        //运行可执行对象 消息来做
                        /*handler.post(new Runnable() {
                            @Override
                            public void run() {
                               执行代码
                            }
                        });*/
                        final Runnable runnable = new Runnable() {
                            @Override
                            public void run() {
                                //执行代码
                            }
                        };
                        handler.post(runnable);
                        runnable.run();
                        //定时任务
                        handler.postDelayed(runnable,5000);

                    }
                }).start();

            }
        });

五: 在子线程中先调用 Looper.prepare(),然后Handler handler = new Handler();//...//Looper.loop();

了解一下Looper

Looper为线程运行消息循环的类。线程默认情况下没有与它们相关的消息循环;创建一个,在要运行循环的线程中调用prepare(),然后让loop()处理,直到循环停止。

与消息循环的大多数交互是通过Handler类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class LooperThread extends Thread {
public void run() {
     Looper.prepare();
     Handler mHandler = new Handler() {
             public void handleMessage(Message msg) {
                 
         }
     };
  Looper.loop();
}
}

六:强引用与弱引用

什么是强引用和弱引用呢?对象的引用机制,使得程序能够灵活地控制对象的生命周期。

强引用(StrongReference)

强引用可以理解为我们生活中必不可少的东西,如你的手机,当你空间不足时(占用空间),你也不会丢弃它,宁可抛出异常,在Java中最为常见的对象,只要此引用存在并且没有被释放就不会被垃圾回收机制回收,只有当释放了,才可能回收。

弱引用(WeakReference)

弱引用即是生活中可有可无的东西,在Java中如果一个对象具备弱引用,那么不管空间是否足够都会被回收。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//创建一个对象
Person person=new Person();
WeakReference<Person> weakPerson=new WeakReference<Person>(person);

七:防止内存泄漏:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static class MyHandler extends Handler{
 //WeakReference
 WeakReference<MainActivity> weakReference;
 public MyHandler(MainActivity activity){
  weakReference = new WeakReference<MainActivity>(activity);
 }
 public void handleMessage(Message msg){
  super.handleMessage(msg);
   if(weakReference.get() != null){
   } 
 }
}

当weakReference.get() != null,表示weakReference指向的对象activity没有被回收。 如果此方法返回为空的话,说明weakReference指向的对象activity已经被回收。 只要指向还指向就不会被回收。

八:例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class OneActivity extends Activity{
 private MyHandler mHandler=new MyHandler(this);
    public static class MyHandler extends Handler{
        
        public final WeakReference<OneActivity > mWeakReference;

        public DiglettHandler(OneActivity activity) {
            mWeakReference = new WeakReference<>(activity);
        }

     @Override
     public void handleMessage(Message msg) {
         super.handleMessage(msg);

         OneActivity activity = mWeakReference.get();
    }
 }
}

九:复习快捷键

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Ctrl+n 查找类
Ctrl+Alt+L 格式化代码
Ctrl+d 复制行
Ctrl+y 删除行

编辑 :达叔

信箱:2397923107@qq.com

定位:分享 Android&Java 知识点

我是简书的达叔小生。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.07.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
声网3D在线互动场景空间音频的实时渲染——如何把“声临其境”推向极致
  //   编者按:千人有千耳,不同的人耳对于声音方位的适应已形成习惯,但在Meta RTC场景中如何让不同人也能畅想“身临其境”的感觉?3D在线互动场景空间音频的实时渲染又有哪些应用?LiveVideoStackCon 2022音视频技术大会上海站邀请到了声网音频策划负责人冯建元,为我们分享3D在线互动场景空间音频的实时渲染。 文/冯建元 整理/LiveVideoStack 大家下午好,我是来自声网的冯建元。 今天给大家主要分享一下声网在RTC 3D互动场景中是如何操作空间音频的渲染。让人在虚拟的场景
LiveVideoStack
2022/09/06
1.3K0
声网3D在线互动场景空间音频的实时渲染——如何把“声临其境”推向极致
空间音频在视频会议场景中的应用
编者按:空间音频(Spatial Audio)在影院、游戏、虚拟现实、舞台录音等场景中得到了广泛的应用,它提供给用户更加接近于真实的听觉感受。空间音频的实现方式有多种,常见的有基于心理声学原理、基于物理声场的重构、和基于双耳音频的精确重放。在人与人的交流沟通场景中,人的双耳听觉对于在嘈杂环境下语音信息的提取和理解起到关键的作用,对提升交互体验和提升有非常大的帮助,但是到目前为止空间音频在远程视频会议沟通场景中的应用还非常少。本次LiveVideoStackCon 2022 上海站邀请到了广州迈聆信息科技有限公司的的李勤老师,一起探讨空间音频在视频会议场景中应用的技术挑战和实现方式。从系统的角度探讨如何在视频会议中提供给用户更好的听觉体验。
LiveVideoStack
2023/01/10
1.7K0
空间音频在视频会议场景中的应用
VR音频,内容制作背后不可忽视的关键
当我们观看VR视频时,往往会有种错觉,听得到耳机里有声音,但是却搞不清声音从哪里传来;或者是偏个头换了观看视角,但是声音并没有随着我们的视角“转过来”,它仍然在原来的地方。确实,如果VR内容里的音频处理不好,沉浸式体验效果将会大打折扣。比如小编之前玩过一个VR射箭游戏,虽然人是在虚拟环境里,但是耳朵里听到的都是外面嘈杂的环境声。 什么是VR音频 VR音频的概念,其实可以和3D音频挂钩。简而言之,VR音频,就是通过耳机或者音箱,结合头部追踪等技术,让体验者在转动头部等动作的时候可以听到自己各个方向不同距离和强
镁客网
2018/05/29
7290
Boom 3d环绕音乐制作软件下载电脑端APP
Boom 3D是适用于Windows和Mac系统的音效增强软件。它带有令人惊叹的3D环绕音效,可适用于各种类型的耳机。它还拥有31个频段的高级均衡器和多种预设音效,可带来全方位的音乐体验。
用户7442547
2022/07/22
1.3K0
AMBEO双声道空间音频携手Netflix为观众提供激动人心的音频体验
森海塞尔AMBEO 双声道空间音频 (AMBEO 2-Channel Spatial Audio) 无需环绕声系统,亦能为观众提供激动人心的音频效果,并让后期混音师完全掌握调校
云上计算
2022/07/14
4060
AMBEO双声道空间音频携手Netflix为观众提供激动人心的音频体验
《除了吃鸡游戏,3D位置语音还可以用在哪里?》
| 导语 在刚刚结束的首届腾讯用户开放日上,腾讯音视频实验室带着3D位置音效解决方案,向所有用户亮相,为用户提供360度立体空间的沉浸式听觉体验,那么这项技术如何结合具体的场景提升用户听感和体验呢?这篇文章将会详细阐述 基于游戏开发引擎(例如Unreal、Unity)实现的3D音效在游戏中的应用已经非常普遍了,通过游戏引擎模拟重现空间中声源方位,例如CS中射击的枪声、中弹时的音效、附近敌人轻微的脚步声,可以显著提高游戏的沉浸感,造就身临其境的游戏体验。 这里我们可以听一段音视频实验室通过3D音效算法处理后的
腾讯Bugly
2018/03/23
1.8K0
MPEG音频编码三十年
 点击上方“LiveVideoStack”关注我们 ▲扫描图中二维码或点击阅读原文▲ 了解音视频技术大会更多信息 ---- 作者:Leonardo Chiariglione 翻译:Alex 技术审校:冯建元 音频编码   视 野 #011# 前言 很明显,声音信息的电子格式要早于视觉信息的电子格式,用电子格式分发声音信息的服务也是如此。同样,音频的数字格式与视频数字格式的出现时间也不同。在上世纪80年代初,唱片公司可以通过CD(Compact Disc)向消费者市场发行数字音频,而在80年代
LiveVideoStack
2022/08/26
7750
MPEG音频编码三十年
沉浸式音频技术的制作,采集,播放及应用
大家好,我是来自时代拓灵的孙学京。本次分享将主要介绍沉浸式音频的从采集制作一直到播放整个链条上所需要的一些软件和硬件的技术。
LiveVideoStack
2019/09/26
2.8K0
沉浸式音频技术的制作,采集,播放及应用
Boom 3D音效增强工具 Mac下载
Boom 3D Mac版是一款强大的3D音效增强工具,可以将二维度的音效转换成三维度,让您彻底的享受一下极致的听觉盛宴!
啾咪啾咪
2022/09/24
6210
探秘VR体验背后的功臣——3D音频技术
VR作为一种新兴科技,能够为用户带来逼真的沉浸式场景体验。为了让用户在虚拟场景中更“入戏”,各大厂商都致力于开发更身临其境的视听解决方案。但我们往往只顾强调优质的视觉体验,而忽略了同样重要的听觉体验。
VRPinea
2018/05/18
2.1K0
3D位置语音,引领吃鸡游戏体验升级
本文主要介绍了腾讯游戏音频引擎技术中的3D位置音效技术,通过此技术可以提升玩家在虚拟环境中的沉浸感。该技术通过算法模拟出声音在三维空间中的位置和运动轨迹,从而使玩家能够准确地判断声音来源的方向和距离。此外,该技术还能够在实时语音场景中应用,提升游戏玩家的语音沟通体验。
腾讯游戏云
2017/12/27
4.1K0
3D位置语音,引领吃鸡游戏体验升级
让游戏沉浸感炸裂的实时3D音效技术原理与实践
3D音效最常见的应用场景是在游戏中。过去,游戏中的3D音效(如枪声、脚步声)普遍基于传统游戏开发引擎(如Unreal、Unity)实现,但当玩家联麦时,原本不管游戏中队友在哪儿,它的声音听上去都差不多。试想一下,在大家都手忙脚乱地“突突突”时,队友发来求助语音“我在你东南方向10米的茅房里中弹了快来扶我……”,你还得看一眼地图再判断判断他们在哪儿。要是能直接听声辨位,玩起来是不是就方便多了?接着戴上耳机再感受一下:
腾讯游戏多媒体引擎GME
2021/06/11
1.9K1
让游戏沉浸感炸裂的实时3D音效技术原理与实践
音效增强软件Boom3D v1.3.8中文版2023免费下载
近些年国内音乐类的综艺节目逐渐增多,《中国好声音》、《我是歌手》、《乐队的夏天》、《中国新说唱》、《声入人心》等等层出不穷,带给了观众更多的观看选择。
用户9208731
2022/11/06
1K1
科普常识:常见音频参数解析
        如果在计算机加上相应的音频卡—就是我们经常说的声卡,我们可以把所有的声音录制下来,声音的声学特性如音的高低等都可以用计算机硬盘文件的方式储存下来。反过来,我们也可以把储存下来的音频文件用一定的音频程序播放,还原以前录下的声音。
朵朵花儿
2019/12/28
3K0
腾讯三维虚拟听觉解决方案 : 一场音效的新革命,开启沉浸感新纪元
本位转载自雷锋网Dude 在首届腾讯用户开放日上,腾讯音频实验室,带着三维虚拟听觉解决方案,向所有的C端用户亮相。 众所周知,好的内容不仅仅只是视觉上的冲击,更需要声色光电等支持。在电影行业有一句话,“没声音再好的戏也出不来”,这句话强调了声音对电影的重要性。对于VR内容,亦复如是。现阶段的VR内容,还停留在视频和视觉阶段,声音的缺位成为了行业的共同痛点。显然,三维虚拟听觉解决方案就是奔着解决痛点而来。 这次,三维虚拟听觉解决方案在用户开放日上的亮相,是腾讯音频实验室所交出的阶段性成绩单 。展区的现场是
腾讯多媒体实验室
2018/04/10
1.2K0
腾讯三维虚拟听觉解决方案 : 一场音效的新革命,开启沉浸感新纪元
Clubhouse:使用空间音频提升对话质量
 点击上方“LiveVideoStack”关注我们 翻译 | Alex 技术审校 | 朱梦尧 本文来自Clubhouse Blog,作者为Clubhouse流媒体技术负责人Justin Uberti。 ▲扫描图中二维码或点击阅读原文▲ 了解音视频技术大会更多信息 空间音频 影音探索 #010# 多年来环绕声一直是影院的一大特色。当你置身于影院中,声音从四面八方传来,这种感觉就像在亲历电影中的情节。空间音频是一种新技术:当你只是戴上耳机,它也能重现影院级别的环绕声。对于Clubhouse这样的群组通
LiveVideoStack
2022/05/05
6230
Clubhouse:使用空间音频提升对话质量
[ Linux Audio 篇 ] 音频开发入门基础知识
在短视频兴起的背景下,音视频开发越来越受到重视。接下来将为大家介绍音频开发者入门知识,帮助读者快速了解这个领域。
程序手艺人
2023/12/04
6790
[ Linux Audio 篇 ] 音频开发入门基础知识
空间感混响效果新高度 Dear Reality 发布全新 EXOVERB MICRO 混响插件
Dear Reality 针对立体声制作推出最新的混响插件 EXOVERB MICRO,提供一流的真实感和空间感混响效果,将立体声混音技术提升至新高度。这个紧凑型音频插件功能非常强大,采用与其姊妹产品 EXOVERB 相同的专有混响引擎驱动。它具有八个专业精心设计打造的声学场景可供选择,声音效果逼真,能够为各类现代音频制作锦上添花。它采用直观的三角形显示板来简化混音过程,实现了后期混响、早期反射音和干讯号的完美平衡。
云上计算
2023/05/09
2800
空间感混响效果新高度 Dear Reality 发布全新 EXOVERB MICRO 混响插件
空间音频技术是如何增强沉浸式体验的?| ARVR
Apple正在开发一种新的音频格式,即使在用户移动,戴着“ Apple Glass ”或其他AR设备时,也可以更轻松沉浸式地在用户周围放置“3d声音”。
mixlab
2020/09/23
1.4K0
空间音频技术是如何增强沉浸式体验的?| ARVR
当VR画面可以做的很逼真时,VR音频的发展又如何呢?
VR可以说是当下最火热的科技趋势之一,但VR音频技术却从没有在专业音频领域获得热捧。虽然音频技术几乎是和视频服务一起进入市场,但在VR游戏、VR电影等中的表现却远不如画面更“吸睛”。
VRPinea
2018/08/21
1K0
当VR画面可以做的很逼真时,VR音频的发展又如何呢?
推荐阅读
相关推荐
声网3D在线互动场景空间音频的实时渲染——如何把“声临其境”推向极致
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档