Android Handler的postDelayed()关闭的方法及遇到问题

前言

最近在使用Handler的时候 发现了一个错误的使用方法

就是直接new 类似这样

new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                showPaySuccessDialog.dismiss();
            }
        }, 1000);

这种用法对于业务简单的情况 也没错 比如 定时关闭一个dialog

但是对于复杂的业务场景 这么用是不对的 也不是不对吧 这么用的话有bug

遇到的问题

我用 直接new Handler()的方法去执行一个播放语音的方法
代码如下

//todo 此处检测
  new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (!MediaplayerUtil.isPlaying()) {
                        MediaplayerUtil.playMusic(context, R.raw.pay_tips);
                    }
                }
            }, 15 * 1000);

我以为这样写没错 但是在测试的时候 出现了一个问题
页面都关闭了 这个语音播报 还在继续 哈哈哈 我同事听到都惊呆了
页面都没有了 语音还在播放 很尴尬
当时听到这个语音 我一耳就听出了问题

因为当时这么写 就觉得不对劲 可能会出问题 所以我加了一个TODO标记
提示这里可能会出问题

解决方法

归根结底 还是我的写法问题 不够正规 偷懒行为 哈哈哈

1、首先创建一个Handler对象

Handler handler=new Handler();

2、然后创建一个Runnable对象

Runnable runnable=new Runnable(){
   @Override
   public void run() {
	    // TODO Auto-generated method stub
   	    //要做的事情,这里再次调用此Runnable对象,以实现每两秒实现一次的定时器操作
    handler.postDelayed(this, 2000);
   }
};

3、使用PostDelayed方法,两秒后调用此Runnable对象

实际上也就实现了一个2s的一个定时器

handler.postDelayed(runnable, 2000);

4、如果想要关闭此定时器,可以这样操作

handler.removeCallbacks(runnable);

Handler 定时器 正确使用方法

//初始化先
 private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        handler = new Handler();

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // 这个是循环 间隔3s弹一次Toast
                handler.postDelayed(this, 3 *1000);
                Toast.makeText(this, "延时5s", Toast.LENGTH_SHORT).show();
            }
        };
        // 延迟2s弹Toasat
        handler.postDelayed(runnable,2000);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在页面结束时 清空队列消息
        if (handler != null) {
            handler.removeCallbacksAndMessages(null);
            handler = null;
        }
    }

到此这篇关于Android Handler的postDelayed()关闭的方法的文章就介绍到这了,更多相关Android Handler的postDelayed()关闭内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • android利用handler实现倒计时功能

    本文实例为大家分享了android利用handler实现倒计时的具体代码,供大家参考,具体内容如下 xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app=&qu

  • 详解Android Handler的使用

    目录 Handler 概要 构造器 sendMessageAtTime dispatchMessage ThreadLocal Looper MessageQueue IdleHandler AsyncMessage和SyncBarrier 阻塞和唤醒机制 Handler内存泄漏分析 Handler 概要 Handler用于线程间的消息传递,它可以将一个线程中的任务切换到另一个线程执行.切换的目标线程与Handler内部持有的Looper所在线程一致.若初始化Handler时未手动设置Loope

  • Android Handler消息机制分析

    目录 Handler是什么? Handler 的基本使用 用法一:通过 send 方法 用法二:通过 post 方法 Handler 类 MessageQueue 类 Looper 类 Handler 的消息接收过程 Handler是什么? Handler 是一个可以实现多线程间切换的类,通过 Handler 可以轻松地将一个任务切换到 Handler 所在的线程中去执行.我们最常用的使用的场景就是更新 UI 了,比如我们在子线程中访问网络,拿到数据后我们 UI 要做一些改变,如果此时我们直接访

  • Android Handler内存泄漏原因及解决方案

    目录: 1.须知: 主线程Looper生命周期和Activity的生命周期一致. 非静态内部类,或者匿名内部类.默认持有外部类引用. 2.原因: Handler造成内存泄露的原因.非静态内部类,或者匿名内部类.使得Handler默认持有外部类的引用.在Activity销毁时,由于Handler可能有未执行完/正在执行的Message.导致Handler持有Activity的引用.进而导致GC无法回收Activity. 3.可能造成内存泄漏 匿名内部类: //匿名内部类 Handler handl

  • Android HandlerThread案例详解

    HandlerThread 顾名思义就是一种可以使用 Handler 的 Thread.日常开发中我们经常会通过创建一个 Thread 去执行任务,有多个任务就多创建几个线程实现,这时候可能出现线程同步的问题.不过有时候我们并不需要很强的并发性,只需保证按照顺序地执行各个任务即可,有什么好办法实现呢?第一反应想到的可能是通过 Executors.newSingleThreadExecutor() 方法来创建一个 SingleThreadExecutor,来统一所有的任务到一个线程中,然后按顺序执

  • 详解Android Handler机制和Looper Handler Message关系

    概述 我们就从以下六个问题来探讨Handler 机制和Looper.Handler.Message之前的关系? 1.一个线程有几个Handler? 2.一个线程有几个Looper?如何保证? 3.Handler内存泄漏原因?为什么其他的内部类没有说过这个问题? 4.为何主线程可以new Handler?如果在想要在子线程中new Handler 要做些什么准备? 5.子线程中维护的Looper,消息队列无消息的时候的处理方案是什么?有什么用? 6.Looper死循环为什么不会导致应用卡死? 一.

  • android利用handler实现打地鼠游戏

    本文实例为大家分享了android利用handler实现打地鼠游戏的具体代码,供大家参考,具体内容如下 xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"

  • Android Handler的postDelayed()关闭的方法及遇到问题

    前言 最近在使用Handler的时候 发现了一个错误的使用方法 就是直接new 类似这样 new Handler().postDelayed(new Runnable() { @Override public void run() { showPaySuccessDialog.dismiss(); } }, 1000); 这种用法对于业务简单的情况 也没错 比如 定时关闭一个dialog 但是对于复杂的业务场景 这么用是不对的 也不是不对吧 这么用的话有bug 遇到的问题 我用 直接new Ha

  • Android实现定时器的3种方法

    在Android开发中,定时器一般有以下3种实现方法: 一.采用Handler与线程的sleep(long)方法 二.采用Handler的postDelayed(Runnable, long)方法 三.采用Handler与timer及TimerTask结合的方法 下面逐一介绍: 一.采用Handle与线程的sleep(long)方法 Handler主要用来处理接受到的消息.这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释. 1. 定义一个Han

  • Android开发使用Handler的PostDelayed方法实现图片轮播功能

    本文实例讲述了Android开发使用Handler的PostDelayed方法实现图片轮播功能.分享给大家供大家参考,具体如下: 第一步:创建MainActivity类 public class BaseActivity extends ActionBarActivity { private List<String> mDatas; private ViewPager mViewPager; private boolean isRun = false; private AutoRunTask

  • android Handler详细使用方法实例

    开发环境为android4.1.Handler使用例1这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中.本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s会继续启动该线程,每次线程的run函数中完成对界面输出nUpdateThread...文字,不停的运行下去,当单击End按钮时,该线程就会停止,如果继续单击Start,则文字又开始输出了. 软件界面如下: 实验主要部分代码和注释: MainActivity.java: 复

  • Android简单实现启动画面的方法

    本文实例讲述了Android简单实现启动画面的方法.分享给大家供大家参考,具体如下: 核心代码: package com.demo.app; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; public class SplashActivity extends Activity { private final int S

  • Android编程实现启动界面的方法分析

    本文实例讲述了Android编程实现启动界面的方法.分享给大家供大家参考,具体如下: 最近在弄一个程序启动界面程序,在这里贴下代码.解释一下:后面Intent(qidong.this,"写想要跳转的Activity"); 效果图: 然后建立一个名字为qidon. Activity: import Android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os

  • 掌握Android Handler消息机制核心代码

    目录 一.handler基本认识 1.基本组成 2.基本使用方法 3.工作流程 二.发送消息 三.消息进入消息队列 1.入队前的准备工作 2.将消息加入队列 四.从消息队列里取出消息 1.准备工作 2.loop中的操作 2.1 MessageQueue的next方法 五.消息的处理 六.其他关键点 1. Loop的创建 2.Handler的创建 3.Message的创建.回收和复用机制 4. IdleHandler 5.Handler在Framework层的应用 阅读前需要对handler有一些

  • Android实现定时器的五种方法实例详解

    一.Timer Timer是Android直接启动定时器的类,TimerTask是一个子线程,方便处理一些比较复杂耗时的功能逻辑,经常与handler结合使用. 跟handler自身实现的定时器相比,Timer可以做一些复杂的处理,例如,需要对有大量对象的list进行排序,在TimerTask中执行不会阻塞子线程,常常与handler结合使用,在处理完复杂耗时的操作后,通过handler来更新UI界面. timer.schedule(task, delay,period); task: Time

  • Android Handler多线程详解

    Android--多线程之Handler 前言 Android的消息传递机制是另外一种形式的"事件处理",这种机制主要是为了解决Android应用中多线程的问题,在Android中不 允许Activity新启动的线程访问该Activity里的UI组件,这样会导致新启动的线程无法改变UI组件的属性值.但实际开发中,很多地方需要在 工作线程中改变UI组件的属性值,比如下载网络图片.动画等等.本篇博客主要介绍Handler是如何发送与处理线程上传递来的消息,并讲解 Message的几种传递数

  • Android实现延迟的几种方法小结

    本文实例总结了Android实现延迟的几种方法.分享给大家供大家参考,具体如下: 一.通过Thread new Thread(){ public void run(){ sleep(***); } }.start(); 通过ProgressDialog的使用来举例说明如下 public class A01Activity extends Activity { Button b; ProgressDialog pd; /** Called when the activity is first cr

随机推荐