1 使用子线程来实现倒计时
- 这里通过开启一个子线程,在线程中开启一个while循环,在这个循环中通过调用方法 seytemClock.sleep(time)
使用这个线程阻塞time时间,然后再进行相关的设置,从而达到倒计时的效果
public class MainActivity2 extends Activity {
private TextView textView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.tv_cd);
/**
* 使用子线程 实现倒计时的功能
*/
Thread thread = new Thread(){
private long total;
public void run(){
super.run();
/**
* 倒计时总长
*/
total = 6000;
/**
* 倒计时时间间隔
*/
long flag = 1000;
while (total >0){
/**
* 设置每间隔flag时间 间隔执行一次
*/
SystemClock.sleep(flag);
/**
* 更新页面显示的时间
*/
MainActivity2.this.runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(total /1000 +"秒");
}
});
total -= flag;
}
...
MainActivity2.this.finish();
}
};
thread.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
2 使用Handler的post方法与Runnable结合实现倒计时功能
- 执行handler.post();方法,方法中传入一个runnable实例对象,会执行 这个实例对象的run方法,在run方法中再进行想着逻辑的判断, 然后调用handler.postDelayed方法实例延迟执行相关操作的方法,
这里是执行了同样的操作,从而达到实现一个倒计时的功能
public class MainActivity extends Activity {
private TextView textView;
private Runnable conrunnble;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.tv_cd);
/**
* 使用handler的post方法与 runnable结合 实现倒计时的功能
*/
final Handler handler = new Handler();
conrunnble = new Runnable() {
/**
* 倒计时总长
*/
long total = 6000;
/**
* 倒计时间隔
*/
long flag = 1000;
@Override
public void run() {
if (total > 0) {
handler.postDelayed(conrunnble, flag);
total = total-flag ;
textView.setText(total / 1000 + "秒");
} else {
...
MainActivity.this.finish();
}
}
};
handler.post(conrunnble);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
3使用Handler 与Message方法实现倒计时功能
- 这个设计思路也是最常用的一种设计
例如: 当点击一个按钮触发事件,在事件中调用 handler的sendMessage的方法,那么在对应的handler的handleMessage中就会接收到这个消息,在这里里面再进行一些逻辑判断,
再通过调用handler的 sendMessageDelayed这个延时发送消息的方法进行消息发送,
同时更新相关的设置信息
public class MainActivity3 extends Activity {
private TextView textView;
private Handler handler;
private long total;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.tv_cd);
/**
* 使用handler 与 message方法实现倒计时功能
*/
/**
* 倒计时总长
*/
total = 6000;
/**
* 倒计时时间间隔
*/
final long flag = 1000;
Message msg = Message.obtain();
msg.what= 001;
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what==001){
if (total >0){
/**
* 发送延时1秒的消息
*/
Message msg1 = Message.obtain();
msg1.what=001;
handler.sendMessageDelayed(msg1,flag);
total= total-flag;
textView.setText(total /1000 +"秒");
}else{
...
MainActivity3.this.finish();
}
}
}
};
handler.sendMessage(msg);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}