使用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()
了