当用户点击一个按钮时如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler;
接下来我们就用Handle来实现倒计时的功能
首先写一个布局,一个Button和一个用来显示文本的TextView(代码我就不展示啦),之后就编写MainActivity.java
package com.example.handlepro;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.lang.ref.WeakReference;
public class MainActivity extends AppCompatActivity {
public static final int COUNTDOWN_TIME_CODE = 10001;
public static final int DELAY_MILLIS = 1000;
public static final int MIN_TIME = 0;
public static final int MAX_TIME = 10;
private TextView countdownTimeTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
//初始化控件
countdownTimeTextView = findViewById (R.id.txt_time);
Button btn_start = findViewById (R.id.btn_1);
//创建点击事件
btn_start.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick(View v) {
//创建Handle
CountdownTimeHandle handler = new CountdownTimeHandle (MainActivity.this);
Message message = Message.obtain ();
message.what = COUNTDOWN_TIME_CODE;
message.arg1 = MAX_TIME;
handler.sendMessageDelayed (message,DELAY_MILLIS);
}
});
}
private static class CountdownTimeHandle extends Handler{
final WeakReference<MainActivity> mWeakReference; //弱引用
CountdownTimeHandle(MainActivity activity) { //按Alt+Ins来构造这个方法
this.mWeakReference = new WeakReference<> (activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage (msg);
MainActivity activity = mWeakReference.get (); //这里是要把Activity拿到
if(msg != null && msg.what == COUNTDOWN_TIME_CODE){
int value = msg.arg1;
activity.countdownTimeTextView.setText (String.valueOf (value--)); //让时间-1
if (value >= MIN_TIME){
Message message = Message.obtain ();
message.what = COUNTDOWN_TIME_CODE;
message.arg1 = value;
sendMessageDelayed (message,DELAY_MILLIS); //延迟一秒发送信息
}
}
}
}
}
如果有不懂的欢迎留言,之后运行程序,单击按钮就可以实现倒计时啦