使用Handler实现Button延迟8秒弹起

有一个需求:
在某些情况下,为了防止频繁地访问网络上的资源,因此设定Button按下之后,延迟8秒才能再次按下。

上代码:

package com.example.handler_button_delay;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;


public class MainActivity extends Activity {

    private Button btn;
    private Handler handler;
    private boolean btnPressed = false;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        btn = (Button) findViewById(R.id.btn);
        handler = new Handler();
        
        // 使用Handler实现Button按下8秒之后弹起
        btn.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                if (!btnPressed) {
                    btn.setEnabled(false);
                    btnPressed = true;
                    
                    handler.postDelayed(new Runnable() {
                        
                        @Override
                        public void run() {
                            if (btnPressed) {
                                btn.setEnabled(true);
                                btnPressed = false;
                            }
                        }
                    }, 8000);
                }
            }
        });
    }
    
}

这里是用到了Handler.postDelay()方法,如果是用Handler.post()方法,会有个ANR Bug,先看代码

package com.example.handler_button_delay;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

    private Button btn;
    private Handler handler;
    private boolean btnPressed = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button) findViewById(R.id.btn);
        handler = new Handler();

        // 使用Handler实现Button按下8秒之后弹起
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (!btnPressed) {
                    btn.setEnabled(false);
                    btnPressed = true;

                    handler.post(new Runnable() {

                        @Override
                        public void run() {
                            try {
                                Thread.sleep(8000);
                                if (btnPressed) {
                                    btn.setEnabled(true);
                                    btnPressed = false;
                                }
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    });
                }
            }
        });
    }

}

上面的代码好像看起来没有问题,但是当按下手机上的返回键盘的是,会出现ANR错误,也就是界面无响应了。即使我重写了onKeyDown()onBackPress()方法,把方法体去掉,还是依然这样。
好吧,我也不懂要如何解决。还是用Handler.postDelay()

posted @ 2015-04-22 16:57  红尘炼心  阅读(234)  评论(0编辑  收藏  举报