电子商城网站系统,重庆热点新闻爆料,工业和信息化部电话,用主机宝建立的网站上传之后404转载#xff1a;http://blog.csdn.net/xiaanming/article/details/9011193 实现定时器有很多种方式#xff0c;在这里我简单的介绍几种方式 实现定时器有很多种方式#xff0c;在这里我简单的介绍几种方式
(1)使用Handler Runnable的方式
Handler handler new Handler(…转载http://blog.csdn.net/xiaanming/article/details/9011193 实现定时器有很多种方式在这里我简单的介绍几种方式 实现定时器有很多种方式在这里我简单的介绍几种方式
(1)使用Handler Runnable的方式
Handler handler new Handler();
Runnable runnable new Runnable() {
Override
public void run() {
//你要做的事
//......
System.out.println(Thread.currentThread().getName());
handler.postDelayed(runnable, 1000);
}
};然后调用handler.post(runnable);就能启动定时器,这里是每隔1s打印线程名字从打印中我们可以知道,他并没有另开线程而是运行在UI线程当中当你要取消定时器的时候只需要调用handler.removeCallbacks(runnable)就可以了。
上面中有一个问题有时候你会发现removeCallbacks有时候会失效不能从消息队列中移除看下面的demo
图两个按钮一个将Runnable加到消息队列中一个将Runnable从消息队列中移除。该Runnable每1秒钟打印一次日志。 import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class TimerActivity extends Activity{ Handler handler new Handler(); Runnable runnable new Runnable() { Override public void run() { System.out.println(update...); handler.postDelayed(runnable, 1000); } }; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.timer); Button mButtonStart (Button) findViewById(R.id.button1); Button mButtonStop (Button) findViewById(R.id.button2); mButtonStart.setOnClickListener(new OnClickListener() { Override public void onClick(View v) { handler.post(runnable); } }); mButtonStop.setOnClickListener(new OnClickListener() { Override public void onClick(View v) { handler.removeCallbacks(runnable); } }); } }
结果1start – 输出 – stop– 停止输出 2start – 输出 – Background – Front – stop-继续输出当Activity进入后台运行后再转入前台运行removeCallbacks无法将updateThread从message queue中移除。 这是为什么呢 在Activity由前台转后台过程中线程是一直在运行的但是当Activity转入前台时会重新定义Runnable runnable也就是说此时从message queue移除的runnable与原先加入message queue中的runnable并非是同一个对象。如果把runnable定义为静态的则removeCallbacks不会失效,对于静态变量在内存中只有一个拷贝节省内存JVM只为静态分配一次内存在加载类的过程中完成静态变量的内存分配,我们做如下修改就能解决上面的这个问题 static Handler handler new Handler(); static Runnable runnable new Runnable() { Override public void run() { System.out.println(update...); handler.postDelayed(runnable, 1000); } };
(2)使用Timer的方式 Timer timer new Timer();
timer.schedule(new TimerTask() { Override public void run() { System.out.println(update....); }
}, 0, 1000);上面的每一秒打印语句run方法是运行在子线程不能直接在里面更新UI操作这里需要注意下取消的话调用timer.cancel()就能移除任务了(3)采用Handle与线程的sleep(long )方法
1.定义一个Handler类用于处理接受到的Message
Handler handler new Handler() { public void handleMessage(Message msg) { super.handleMessage(msg); System.out.println(update...); } 2.新建一个实现Runnable接口的线程类用一个boolean 来控制线程开始和结束 boolean isLive true如下 public class MyThread implements Runnable { Override public void run() { while (isLive) { try { Thread.sleep(1000);// 线程暂停1秒单位毫秒 Message message new Message(); message.what 1; handler.sendMessage(message);// 发送消息 } catch (InterruptedException e) { e.printStackTrace(); } } } } 3.在需要启动线程的地方加入下面语句new Thread(new MyThread()).start();4.取消的话将isLive设置为false就行了