【转】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);
    }
};

 

posted on 2014-10-30 10:48  屌丝迷途  阅读(1430)  评论(0编辑  收藏  举报

导航