Handle实现单击倒计时

当用户点击一个按钮时如果任意一个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);        //延迟一秒发送信息
                }
            }
        }
    }
}

如果有不懂的欢迎留言,之后运行程序,单击按钮就可以实现倒计时啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值