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);
        }
    };
  • 相关阅读:
    diff命令
    vsftp建立虚拟用户不同目录分配不同权限操作步骤详解
    vsftpd配置文件详解
    vsftp 详解鸟哥版
    vsftp 虚拟用户
    xfs文件系统磁盘配额
    磁盘配额
    磁盘配额实例详解
    Linux 文件服务---------- nfs Server
    [转]Win7 UAC的安全、兼容及权限
  • 原文地址:https://www.cnblogs.com/l2rf/p/4062027.html
Copyright © 2011-2022 走看看