timertask-android倒计时程序的崩溃问题

问题描述

android倒计时程序的崩溃问题
必须在分钟和秒两栏中都输入才可以正常计时,否则会崩溃,这是为什么??求大侠帮忙!!!

Java代码是

```package com.example.countt;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {
private EditText etMinute etSecond;
private Button btnStartTime btnStopTime;
private TextView time;
private int i = 0;
private int i2 = 0;
private Timer timer = null;
private TimerTask task = null;

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initViews();}private void initViews() {    etMinute = (EditText) findViewById(R.id.etMinute);    etSecond = (EditText) findViewById(R.id.etSecond);    btnStartTime = (Button) findViewById(R.id.btnStartTime);    btnStopTime = (Button) findViewById(R.id.stopTime);    time = (TextView) findViewById(R.id.time);    btnStartTime.setOnClickListener(this);    btnStopTime.setOnClickListener(this);}@Overridepublic void onClick(View v) {    switch (v.getId()) {    case R.id.btnStartTime:        i = Integer.parseInt(etSecond.getText().toString());        i2 = Integer.parseInt(etMinute.getText().toString());        startTime();        break;    case R.id.stopTime:        stoptTime();        break;    default:        break;    }}private Handler sHandler = new Handler() {    public void handleMessage(Message msg) {        if (msg.arg1 == -1) {            timer.cancel();        }         else if(msg.arg1==0){            time.setText(""00:00"");        }        else if (msg.arg1 != 0 && ((int) msg.arg1/60) < 10 && msg.arg1%60 < 10) {            time.setText(""0"" + (int) msg.arg1 / 60 + "":"" + ""0"" + msg.arg1                    % 60);            startTime();        } else if (msg.arg1 != 0 && ((int) msg.arg1/60) > 10 && msg.arg1%60 < 10) {            time.setText((int) msg.arg1 / 60 + "":"" + ""0"" + msg.arg1 % 60);            startTime();        } else if (msg.arg1 != 0 && ((int) msg.arg1/60) < 10 && msg.arg1%60 > 10) {            time.setText(""0"" + (int) msg.arg1 / 60 + "":"" + msg.arg1 % 60);            startTime();        } else {            time.setText((int) msg.arg1 / 60 + "":"" + msg.arg1 % 60);            startTime();        }    };};private void startTime() {    timer = new Timer();    task = new TimerTask() {        @Override        public void run() {            if(i==0&&i2==0){                timer.cancel();            }            if(i2==0&&i!=0){                Message msg = sHandler.obtainMessage();                msg.arg1 = i;                sHandler.sendMessage(msg);            }            else if (i == 0&&i2!=0) {                i2--;                i = 60;                Message msg = sHandler.obtainMessage();                msg.arg1 = i + i2 * 60;                sHandler.sendMessage(msg);            } else {                i--;                Message msg = sHandler.obtainMessage();                msg.arg1 = i + i2 * 60;                sHandler.sendMessage(msg);            }        }    };    timer.schedule(task 1000);}private void stoptTime() {    timer.cancel();}

}

layout布局文件是```<LinearLayout xmlns:android=""http://schemas.android.com/apk/res/android""    xmlns:tools=""http://schemas.android.com/tools""    android:layout_width=""match_parent""    android:layout_height=""match_parent""    android:orientation=""vertical""    tools:context=""com.example.countt.MainActivity"" ><LinearLayout android:layout_width=""match_parent""    android:layout_height=""wrap_content""    android:orientation=""horizontal"">    <EditText        android:id=""@+id/etMinute""        android:layout_width=""match_parent""        android:layout_height=""wrap_content""        android:layout_weight=""1""        >    </EditText>    <TextView android:layout_width=""wrap_content""        android:layout_height=""wrap_content""        android:text=""分钟  ""/>    <EditText        android:id=""@+id/etSecond""        android:layout_width=""match_parent""        android:layout_height=""wrap_content""        android:layout_weight=""1""          >    </EditText>    <TextView android:layout_width=""wrap_content""        android:layout_height=""wrap_content""        android:text=""秒  ""/></LinearLayout><LinearLayout android:layout_width=""match_parent""    android:layout_height=""wrap_content""    android:gravity=""center""    android:orientation=""horizontal"">    <TextView        android:gravity=""center""        android:id=""@+id/time""        android:layout_width=""match_parent""        android:layout_height=""300dp""        android:text=""00:00""        android:textColor=""#0000ff""        android:textSize=""40sp"" />    </LinearLayout>    <Button        android:id=""@+id/btnStartTime""        android:layout_width=""match_parent""        android:layout_height=""wrap_content""        android:text=""开始计时"" />    <Button        android:id=""@+id/stopTime""        android:layout_width=""match_parent""        android:layout_height=""wrap_content""        android:text=""停止计时"" /></LinearLayout>

解决方案

1。安卓 有这个控件 Chronometer,你最好用这个;自己做,肯定要用到线程;
2.我估计你是线程崩溃,引起的崩溃;

解决方案二:
不嫌弃的话可以试试我这个,不过没什么注释

public class CustomTimer {
private Handler mHandler;
private static final int TIME_UNIT = 1000;
private static final int RADIX = 60;
private int totalSec = 0;
private Timer mTimer;
private TimerTask mTask;

public static final int MSG_WHAT = 1111;public static final int MSG_PAUSE = 1112;public static final int MSG_CONTINUE = 1113;public CustomTimer(final Handler handler) {    this.mHandler = handler;    mTimer = new Timer(true);}/** * 倒计时秒数 * * @param max */public void countDownTime(final int max) {    if (mTimer == null)        mTimer = new Timer(true);    mTask = new TimerTask() {        @Override        public void run() {            Message mMessage = mHandler.obtainMessage();            mMessage.what = MSG_WHAT;            totalSec++;            mMessage.obj = max - totalSec;            mHandler.sendMessage(mMessage);        }    };    mTimer.schedule(mTask TIME_UNIT TIME_UNIT);}/** * 倒计时时分秒 * * @param max */public void countDownFormatTime(final int max) {    if (mTimer == null)        mTimer = new Timer(true);    mTask = new TimerTask() {        @Override        public void run() {            Message mMessage = mHandler.obtainMessage();            mMessage.what = MSG_WHAT;            totalSec++;            mMessage.obj = getFormatTime(max - totalSec);            mHandler.sendMessage(mMessage);        }    };    mTimer.schedule(mTask TIME_UNIT TIME_UNIT);}public void countTime(int start) {    if (mTimer == null)        mTimer = new Timer(true);    totalSec = start;    mTask = new TimerTask() {        @Override        public void run() {            totalSec++;            Message mMessage = mHandler.obtainMessage();            mMessage.what = MSG_WHAT;            mMessage.obj = getFormatTime(totalSec);            mHandler.sendMessage(mMessage);        }    };    mTimer.schedule(mTask TIME_UNIT TIME_UNIT);}public int stopCountDown() {    int usedTime = totalSec;    if (mTask != null) {        mTask.cancel();        totalSec = 0;        mTask = null;        mTimer = null;    }    return usedTime;}public String stopCountDownFormatTime() {    String usedTime = getFormatTime(totalSec);    if (mTask != null) {        mTask.cancel();        totalSec = 0;        mTask = null;        mTimer = null;    }    return usedTime;}public String stopCount() {    String usedTime = getFormatTime(totalSec);    if (mTask != null) {        mTask.cancel();        mTask = null;        mTimer = null;        totalSec = 0;    }    return usedTime;}public static String getFormatTime(int totalSec) {    int minute = totalSec / RADIX;    int second = totalSec % RADIX;    return String.format(""%1$02d:%2$02d"" minute second);}public static int getNotFormatTime(String time) {    int ret = 0;    if (time != null) {        String[] split = time.split("":"");        ret = Integer.valueOf(split[0]) * 60 + Integer.valueOf(split[1]);    }    return ret;}

}

这是一个简单的倒计时例子
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case CustomTimer.MSG_WHAT: //计时器发来的信息
String time = msg.obj.toString();
txt_time.setText(time); //计时操作
//考试时间到
if (time.equals(""00:00"")) {
txt_time.setText(""00:00"");
mTimer.stopCount();//停止计时操作

                    }                    break;            }        }    };    mTimer = new CustomTimer(mHandler);//初始化计时器            mTimer.countDownFormatTime(100);            另外,还有正计时的功能。

解决方案三:
public class CustomTimer {
private Handler mHandler;
private static final int TIME_UNIT = 1000;
private static final int RADIX = 60;
private int totalSec = 0;
private Timer mTimer;
private TimerTask mTask;

public static final int MSG_WHAT = 1111;
public static final int MSG_PAUSE = 1112;
public static final int MSG_CONTINUE = 1113;

public CustomTimer(final Handler handler) {
this.mHandler = handler;
mTimer = new Timer(true);
}

/**

  • 倒计时秒数*
  • @param max
    */
    public void countDownTime(final int max) {
    if (mTimer == null)
    mTimer = new Timer(true);

    mTask = new TimerTask() {
    @Override
    public void run() {
    Message mMessage = mHandler.obtainMessage();
    mMessage.what = MSG_WHAT;
    totalSec++;
    mMessage.obj = max - totalSec;
    mHandler.sendMessage(mMessage);
    }
    };
    mTimer.schedule(mTask TIME_UNIT TIME_UNIT);

}

/**

  • 倒计时时分秒*
  • @param max
    */
    public void countDownFormatTime(final int max) {
    if (mTimer == null)
    mTimer = new Timer(true);

    mTask = new TimerTask() {
    @Override
    public void run() {
    Message mMessage = mHandler.obtainMessage();
    mMessage.what = MSG_WHAT;
    totalSec++;
    mMessage.obj = getFormatTime(max - totalSec);
    mHandler.sendMessage(mMessage);
    }
    };
    mTimer.schedule(mTask TIME_UNIT TIME_UNIT);

}

public void countTime(int start) {
if (mTimer == null)
mTimer = new Timer(true);
totalSec = start;
mTask = new TimerTask() {
@Override
public void run() {
totalSec++;
Message mMessage = mHandler.obtainMessage();
mMessage.what = MSG_WHAT;
mMessage.obj = getFormatTime(totalSec);
mHandler.sendMessage(mMessage);
}
};
mTimer.schedule(mTask TIME_UNIT TIME_UNIT);
}

public int stopCountDown() {
int usedTime = totalSec;
if (mTask != null) {
mTask.cancel();
totalSec = 0;
mTask = null;
mTimer = null;
}
return usedTime;
}

public String stopCountDownFormatTime() {
String usedTime = getFormatTime(totalSec);
if (mTask != null) {
mTask.cancel();
totalSec = 0;
mTask = null;
mTimer = null;
}
return usedTime;
}

public String stopCount() {
String usedTime = getFormatTime(totalSec);
if (mTask != null) {
mTask.cancel();
mTask = null;
mTimer = null;
totalSec = 0;
}
return usedTime;
}

public static String getFormatTime(int totalSec) {
int minute = totalSec / RADIX;
int second = totalSec % RADIX;
return String.format(""%1$02d:%2$02d"" minute second);
}

public static int getNotFormatTime(String time) {
int ret = 0;
if (time != null) {
String[] split = time.split("":"");
ret = Integer.valueOf(split[0]) * 60 + Integer.valueOf(split[1]);
}
return ret;
}

}

这是一个简单的倒计时例子
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case CustomTimer.MSG_WHAT: //计时器发来的信息
String time = msg.obj.toString();
txt_time.setText(time); //计时操作
//考试时间到
if (time.equals(""00:00"")) {
txt_time.setText(""00:00"");
mTimer.stopCount();//停止计时操作

                }                break;        }    }};mTimer = new CustomTimer(mHandler);//初始化计时器        mTimer.countDownFormatTime(100);        另外,还有正计时的功能。

解决方案四:
你可以给时分都设置一个默认值呀

时间: 2024-10-24 10:20:08

timertask-android倒计时程序的崩溃问题的相关文章

Android我们要友好的告诉用户,程序要崩溃了

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992     虽然我们的程序在正式上线之前,都会经过严格的测试,从而保证程序的健壮性和良好的用户体验,但是,一个人的测试或者是几个人的测试团队,都不能和上万甚至数十万的用户相比.因此,前期刚上线的程序在用户手里被玩崩了,也是很常见的事,但是,如果我们不做特殊处理,系统自带的程序崩溃提示真的太吓人了,用户看到之后会不知所措,因此,我们需要一个解决方案,就是在程序即将崩溃的时候,给用户一个更加友好的提示,来告诉他,

android 当在主线程里开启一个新线程 程序就崩溃

问题描述 android 当在主线程里开启一个新线程 程序就崩溃 我要实现的功能是检索SDcard里的所有txt文件我尝试过很多办法 1 不用线程 直接在主线程里检索文件 由于有循环且检索时间会超过5秒 导致黑屏然后提示未响应2 我建立一个线程让线程去检索文件当检索完毕后把检索到的文件传递给主类 主类再把检索到的文件显示在list上 但是当线程一启动程序就崩溃了3 最后我在主类里添加handler 当子线程检索完毕就sendmessage给主类 然后主类把子线程检索到的文件显示在list上但程序

Android eclipse 程序调试

一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的. 步骤如下. 1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoint菜单项即可. 2 在debug模式下运行程序进入调试状态:通过点击工具栏上的小虫按钮或者是在项目右键点击然后选择Debug  As,Android Application菜单,启动程序的调试模式. 第一次运行调试模式eclipse会弹出如下确认窗口 当程序运行到你的断点地方时就会停下,这时可

android 横竖屏切换崩溃

问题描述 android 横竖屏切换崩溃 横竖屏切换4到5次崩溃,直接退出,求各位大神指点... 10-16 09:42:11.367 122-610/? E/FrameworkListener﹕ read() failed (Connection reset by peer) 10-16 09:42:13.431 13890-13890/com.zhd.hiqse E/linker﹕ load_library(linker.cpp:759): library "libmaliinstr.so&

《Android安全技术揭秘与防范》——第2.1节Android应用程序概览

2.1 Android应用程序概览 Android开发秘籍(第2版) Android应用程序包含的功能五花八门,比如编辑文本.播放音乐.启动闹钟或是打开通讯录等.这些功能可以被分类对应到4类Android组件之中,如表2-1所示,每一类都对应一个Java基本类. 每个应用程序都由一个或多个这样的组件组成.当要用到某个组件时,Android操作系统就会将其初始化.其他应用程序在指定的权限内也可以使用它们. 随着在操作系统中展现多种功能(有些功能甚至与预期的应用程序无关,如呼入电话),每个组件经历了

利用FRIDA攻击Android应用程序(一)

前言 直到去年参加RadareCon大会时,我才开始接触动态代码插桩框架Frida.最初,我感觉这玩意还有点意思,后来发现这种感觉是不对的:应该是非常有意思.您还记得游戏中的上帝模式吗?面对本地应用程序的时候,一旦拥有了Frida,也就拥有了这种感觉.在这篇文章中,我们重点介绍Frida在Android应用方面的应用.在本文的第二篇中,我们将会介绍如何利用Frida来应付Android环境下的crackme问题. 什么是动态代码插桩?  动态二进制插桩(DBI)意味着将外部代码注入到现有的(正在

利用FRIDA攻击Android应用程序(三)

利用FRIDA攻击Android应用程序(三)       前言 在我的有关frida的第二篇博客发布不久之后,@muellerberndt决定发布另一个OWASP Android crackme,我很想知道是否可以再次用frida解决.如果你想跟着我做一遍,你需要下面的工具. OWASP Uncrackable Level2 APK Android SDK和模拟器(我使用的是Android 7.1 x64镜像) frida(和frida-server) bytecodeviewer radar

Android实现将应用崩溃信息发送给开发者并重启应用的方法_Android

本文实例讲述了Android实现将应用崩溃信息发送给开发者并重启应用的方法.分享给大家供大家参考,具体如下: 在开发过程中,虽然经过测试,但在发布后,在广大用户各种各样的运行环境和操作下,可能会发生一些异想不到的错误导致程序崩溃.将这些错误信息收集起来并反馈给开发者,对于开发者改进优化程序是相当重要的.好了,下面就来实现这种功能吧. (更正时间:2012年2月9日18时42分07秒) 由于为历史帖原因,以下做法比较浪费,但抓取异常的效果是一样的. 1.对于UI线程(即Android中的主线程)抛

程序中集成了环信im,但是程序发送崩溃的时候,整个程序就没有响应,怎么点也没用

问题描述 环信Demo中就有这个问题,大家可以让程序故意崩溃,随后android弹出强制关闭窗口,然后程序就没有反应了.即使最近任务中将之删除,再点击程序图标,依然启不来.     可以在GroupsActivity中groupListView.setOnItemClickListener(new OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> pare