安卓开发7——计时器(多线程应用)

目录

一、实验内容

二、实验过程和结果

三、代码


一、实验内容

实现一个倒计时时钟,创建子线实现计时功能,使用异步消息机制将计时结果显示在界面上,在文本框中输入数字(使用Number文本框),点击开始按钮后,下方文本框的数字每秒减1,点击停止即停止倒计时。

二、实验过程和结果

1、首先设置布局,包括两个Button(btnStart和btnStop,分别用于开始和停止倒计时),一个Number文本框,用于用户设置倒计时的开始时间。

2、创建Handler对象,从中获取控件,并在里面对UI进行改变操作。Handler是安卓提供的一套异步消息处理机制。

3、实现btnStart点击事件,在里面获取一次Number文本框,得到用户输入的倒计时开始时间。isWork用于判断是否暂停计时,当它为true是正常执行线程中的内容,即正常计时。当它为false时,则不执行线程中的内容,达到计时暂停效果。线程中创建了一个Message对象,之后调用了Handler的sendMessage()方法将这条Message发送出去。接着Handler就会收到这条Message,并在handleMessage()方法中对它进行处理,注意handleMessage()中的代码是在主线程当中运行的。Thread.sleep(1000)为间隔一秒执行。注意要最后要在结尾启动线程,“.start()”。

4、当点击btnStop按钮时,将isWork置为false。

5、程序运行结果如图。

三、代码

package com.example.lab.mytimer;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

     boolean isWork;
    String number;
    EditText edtNumber;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btnStart=(Button)findViewById(R.id.btn_start);
        Button btnStop=(Button)findViewById(R.id.btn_stop);



        final Handler handler=new Handler(){

            @Override
            public void handleMessage(Message msg) {
                edtNumber=(EditText)findViewById(R.id.editText);
                edtNumber.setText(String.valueOf(msg.what));
            }
        };

        btnStart.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                EditText edtCount=(EditText)findViewById(R.id.editText);
                number=String.valueOf(edtCount.getText());
                isWork=true;
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try{
                            for(int i=Integer.valueOf(number)-1;i>=0;i--){
                                if(isWork){
                                    //间隔一秒
                                    Thread.sleep(1000);
                                    Message msg=new Message();
                                    msg.what=i;
                                    handler.sendMessage(msg);
                                }
                            }

                        }catch(Exception e){
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
        });

        btnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(isWork){
                    //停止
                    isWork=false;
                }
            }
        });
    }
}

猜你喜欢

转载自blog.csdn.net/h2503652646/article/details/86471273
今日推荐