这里有新鲜出炉的精品教程,程序狗速度看过来!
Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。
本篇文章主要介绍了Android实现定时器Timer的停止和重启实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文介绍了Android定时器Timer的停止和重启实现代码,分享给大家,具体如下:
7月份做了一个项目,利用自定义控件呈现一幅动画,当时使用定时器来控制时间,但是当停止开启时总是出现问题。一直在寻找合理的方法解决这个问题,一直没有找到,最近终于找到了合理的方法来解决这个问题。
大家如何查询有关资料,一定知道timer,timertask取消的方式是采用Timer.cancel()和mTimerTask.cancel(),可是大家发现这种发式取消后,再次开始timer时,会报错
- FATAL EXCEPTION: main
- Process: com.example.zhongzhi.gate_control_scheme, PID: 2472
- java.lang.IllegalStateException: Timer already cancelled.
- at java.util.Timer.sched(Timer.java:397)
- at java.util.Timer.schedule(Timer.java:248)
- at com.example.zhongzhi.gate_control_scheme.MainActivity.onClick(MainActivity.java:401)
- at android.view.View.performClick(View.java:5637)
- at android.view.View$PerformClick.run(View.java:22429)
- at android.os.Handler.handleCallback(Handler.java:751)
- at android.os.Handler.dispatchMessage(Handler.java:95)
- at android.os.Looper.loop(Looper.java:154)
- at android.app.ActivityThread.main(ActivityThread.java:6119)
- at java.lang.reflect.Method.invoke(Native Method)
- at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
- at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
这个问题的解决采用cancle(),取消timer后,还需要清空timer。合理的代码应该是这样的:
- mTimer.cancel();
- mTimer = null;
- mTimerTask.cancel();
- mTimerTask = null;
关键的问题解决完了,下面给出我的案例代码Mainactivity.Java:
- public class MainActivity extends AppCompatActivity {
- private static String TAG = "TimerDemo";
- private TextView mTextView = null;
- private Button mButton_start = null;
- private Button mButton_pause = null;
- private Timer mTimer = null;
- private TimerTask mTimerTask = null;
- private Handler mHandler = null;
- private static int count = 0;
- private boolean isPause = false;
- private boolean isStop = true;
- private static int delay = 1000; //1s
- private static int period = 1000; //1s
- private static final int UPDATE_TEXTVIEW = 0;
- @Override public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mTextView = (TextView) findViewById(R.id.mytextview);
- mButton_start = (Button) findViewById(R.id.mybutton_start);
- mButton_pause = (Button) findViewById(R.id.mybutton_pause);
- mButton_start.setOnClickListener(new Button.OnClickListener() {
- public void onClick(View v) {
- if (isStop) {
- Log.i(TAG, "Start");
- } else {
- Log.i(TAG, "Stop");
- }
- isStop = !isStop;
- if (!isStop) {
- startTimer();
- } else {
- stopTimer();
- }
- if (isStop) {
- mButton_start.setText(R.string.start);
- } else {
- mButton_start.setText(R.string.stop);
- }
- }
- });
- mButton_pause.setOnClickListener(new Button.OnClickListener() {
- public void onClick(View v) {
- if (isPause) {
- Log.i(TAG, "Resume");
- } else {
- Log.i(TAG, "Pause");
- }
- isPause = !isPause;
- if (isPause) {
- mButton_pause.setText(R.string.resume);
- } else {
- mButton_pause.setText(R.string.pause);
- }
- }
- });
- mHandler = new Handler() {@Override public void handleMessage(Message msg) {
- switch (msg.what) {
- case UPDATE_TEXTVIEW:
- updateTextView();
- break;
- default:
- break;
- }
- }
- };
- }
- private void updateTextView() {
- mTextView.setText(String.valueOf(count));
- }
- private void startTimer() {
- if (mTimer == null) {
- mTimer = new Timer();
- }
- if (mTimerTask == null) {
- mTimerTask = new TimerTask() {@Override public void run() {
- Log.i(TAG, "count: " + String.valueOf(count));
- sendMessage(UPDATE_TEXTVIEW);
- do {
- try {
- Log.i(TAG, "sleep(1000)...");
- Thread.sleep(1000);
- } catch(InterruptedException e) {}
- } while ( isPause );
- count++;
- }
- };
- }
- if (mTimer != null && mTimerTask != null) mTimer.schedule(mTimerTask, delay, period);
- }
- private void stopTimer() {
- if (mTimer != null) {
- mTimer.cancel();
- mTimer = null;
- }
- if (mTimerTask != null) {
- mTimerTask.cancel();
- mTimerTask = null;
- }
- count = 0;
- }
- public void sendMessage(int id) {
- if (mHandler != null) {
- Message message = Message.obtain(mHandler, id);
- mHandler.sendMessage(message);
- }
- }
- }
xml部分代码:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/mytextview"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:text="@string/number" />
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:orientation="horizontal" >
- <Button
- android:id="@+id/mybutton_start"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/start" />
- <Button
- android:id="@+id/mybutton_pause"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/pause" />
- </LinearLayout>
- </LinearLayout>
string部分代码:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="app_name">TimerDemo</string>
- <string name="number">0</string>
- <string name="start">start</string>
- <string name="stop">stop</string>
- <string name="pause">pause</string>
- <string name="resume">resume</string>
- </resources>
上面就是我的源代码,如果大家有什么问题可以留言进行探讨。
来源: http://www.phperz.com/article/17/0912/345919.html