zoukankan      html  css  js  c++  java
  • 【转】handler.removeCallbacks失效问题

    package com.example.demoactivity;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class TimerActivity extends Activity{
        Handler handler = new Handler();
        Runnable runnable = new Runnable() {
            
            @Override
            public void run() {
                System.out.println("update...");
                handler.postDelayed(runnable, 1000);
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.timer);
            
            Button mButtonStart = (Button) findViewById(R.id.button1);
            Button mButtonStop = (Button) findViewById(R.id.button2);
            
            mButtonStart.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    handler.post(runnable);
                }
            });
            
            mButtonStop.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    handler.removeCallbacks(runnable);
                }
            });
        }
        
    }

    结果:
    (1)start –>  输出 –> stop–> 停止输出
    (2)start –> 输出 –>  Background –> Front –> stop->继续输出

    当Activity进入后台运行后再转入前台运行,removeCallbacks无法将updateThread从message queue中移除。
    这是为什么呢?
    在Activity由前台转后台过程中,线程是一直在运行的,但是当Activity转入前台时会重新定义Runnable runnable;也就是说此时从message queue移除的runnable与原先加入message queue中的runnable并非是同一个对象。如果把runnable定义为静态的则removeCallbacks不会失效,对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,我们做如下修改就能解决上面的这个问题

    static Handler handler = new Handler();
    static Runnable runnable = new Runnable() {
        
        @Override
        public void run() {
            System.out.println("update...");
            handler.postDelayed(runnable, 1000);
        }
    };
  • 相关阅读:
    查找mysql数据库中所有包含特定名字的字段所在的表
    redis在windows下安装和PHP中使用
    CentOS 6.3下源码安装LAMP(Linux+Apache+Mysql+Php)环境
    telnet: connect to address 127.0.0.1: Connection refused
    [Java]局域网五子棋
    springboot-web进阶(三)——统一异常处理
    springboot-web进阶(二)——AOP统一处理请求
    springboot-web进阶(一)——表单验证
    springboot快速入门(五)——事务管理
    springboot快速入门(四)——数据库操作
  • 原文地址:https://www.cnblogs.com/l2rf/p/4062027.html
Copyright © 2011-2022 走看看