Android使用Handler+postDelayed实现简单计时器
来源:互联网 发布:亚洲顶尖婚礼网络 编辑:程序博客网 时间:2024/05/16 09:29
我们在开发中会时常用到计时器,比如计算我们的APP工作的时长,下面介绍两种实现方案。
一、使用Handler+postDelayed实现计时器
先看效果图:
实现的代码:
public class MainActivity extends AppCompatActivity { protected Button btnStart; protected Button btnEnd; static TextView tvWorkTime; static Handler timeHandler = new Handler(); static Date beginDate = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_main); initView(); } private void initView() { btnStart = (Button) findViewById(R.id.btn_start); btnEnd = (Button) findViewById(R.id.btn_end); tvWorkTime = (TextView) findViewById(R.id.tv_work_time); } public void start(View view) { btnStart.setVisibility(View.GONE); btnEnd.setVisibility(View.VISIBLE); beginDate = new Date(); timeHandler.postDelayed(runnable, 1000); } public void end(View view) { btnStart.setVisibility(View.VISIBLE); btnEnd.setVisibility(View.GONE); timeHandler.removeCallbacks(runnable); } static Runnable runnable = new Runnable() { @Override public void run() { TimeUtils(beginDate, new Date()); timeHandler.postDelayed(this, 1000); } }; public static void TimeUtils(Date beginDate, Date endDate){ SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); long between = 0; Date begin = null; Date end = null; try { begin = dfs.parse(datetimeToString(beginDate)); end = dfs.parse(datetimeToString(endDate)); between = (end.getTime() - begin.getTime());// 得到两者的毫秒数 } catch (ParseException e) { e.printStackTrace(); } long day = between / (24 * 60 * 60 * 1000); long hour = (between / (60 * 60 * 1000) - day * 24); long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60); long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); tvWorkTime.setText("工作时长:" + hour + " : " + min + " : " + s); } public static String datetimeToString(Date date) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.format(date); }}
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="30dp" android:layout_marginTop="20dp" android:background="@drawable/button" android:onClick="start" android:text="开始计时" android:textSize="24sp"/> <Button android:id="@+id/btn_end" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="30dp" android:layout_marginTop="20dp" android:background="@drawable/button" android:onClick="end" android:visibility="gone" android:text="结束计时" android:textSize="24sp"/> <TextView android:id="@+id/tv_work_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="工作时长:0 : 0 : 0" android:layout_marginTop="30dp" android:layout_marginLeft="20dp" android:textSize="20sp" android:layout_alignParentBottom="true" android:layout_marginBottom="12dp"/></LinearLayout>
按钮样式:
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="false"> <shape android:shape="rectangle" > <solid android:color="#0FFFFF" /> <corners android:radius="15dip" /> <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" /> </shape> </item> <item android:state_pressed="true"> <shape android:shape="rectangle"> <solid android:color="#FFFF0F" /> <corners android:radius="15dip" /> </shape> </item></selector>
二、使用Chronometer实现计时器
public class Main2Activity extends AppCompatActivity { protected Chronometer timer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_main2); initView(); } private void initView() { timer = (Chronometer) findViewById(R.id.timer); } public void start(View view){ timer.setBase(SystemClock.elapsedRealtime());//计时器清零 int hour = (int) ((SystemClock.elapsedRealtime() - timer.getBase()) / 1000 / 60); timer.setFormat("0"+String.valueOf(hour)+":%s"); timer.start(); } public void stop(View view){ timer.stop(); }}
布局文件:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="start" android:onClick="start"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="stop" android:onClick="stop"/> <Chronometer android:layout_width="match_parent" android:layout_height="wrap_content" android:format="00:00:00" android:textSize="20sp" android:id="@+id/timer"/></LinearLayout>
阅读全文
0 0
- Android使用Handler+postDelayed实现简单计时器
- Android中三种计时器Timer、CountDownTimer、handler.postDelayed的使用
- 简单使用handler.postDelayed()方法
- Android Handler post postDelayed postAtTime 简单说明及使用
- android 使用Handler.postDelayed方法实现循环执行定时任务
- Handler 实现简单的计时器
- Android 使用Handler的PostDelayed方法实现图片的轮播
- Android使用Handler的postDelayed(Runnable, long)方法实现定时任务
- Android中使用Handler的postDelayed(Runnable, long)方法实现定时循环发送数据
- 简单实现Android计时器
- android 使用handler 与postDelayed时注意项
- 进阶_计时器(postDelayed实现)_150503
- Android之Handler:实现计时器实例
- 【自用】Android中一个简单的计时器,用Handler加Runnable线程实现
- Android简单计时器的实现
- Android简单的计时器实现
- Android 计时器的简单实现
- 【Android】使用Chronometer组件实现一个简单的计时器
- python函数 多变量
- jquery 对象不支持on属性或方法
- rtmp直播拉流客户端EasyRTMPClient设计过程中时间戳问题汇总
- Centos 7上Docker私有仓库Registry
- 我们说的 JVM 内存是什么
- Android使用Handler+postDelayed实现简单计时器
- Restful API的请求拦截
- 线程安全的无锁RingBuffer的实现【一个读线程,一个写线程】
- Spiral Matrix
- mac安装genymotion出现重新下载版本错误解决
- 常用的数据恢复方法
- 面试/笔试第五弹 —— Java面试问题集锦(下篇)
- EasyPlayer Android RTSP播放器延迟再优化策略
- [Burnside引理] HDU5868. Different Circle Permutation