• 【转】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);
        }
    };
  • 相关阅读:
    ubuntu mysql 的安装与简单操作
    JavaScript中的返回函数的函数
    JavaScript中的作用域
    JavaScript中的面向对象【一】
    JavaScript中的函数是数据
    JavaScript中的面向对象【二】
    JavaScript中的函数重写自己
    JavaScript中的匿名函数、回调函数、自调用函数
    JavaScript中的闭包
    mysql添加索引
  • 原文地址:https://www.cnblogs.com/l2rf/p/4062027.html
Copyright © 2020-2023  润新知