安卓/android的延时/定时方式
2016-07-31 本文已影响790人
阿敏其人
本文出自 “阿敏其人” 简书博客,转载或引用请注明出处。
一、先上总结
** 1、第一种 TimerTask+Timer 延时器 **
// =========== 第一种 TimerTask+Timer 延时器
/**
* Timer类可以用来计划执行循环执行任务,但是如果手就休眠了,任务就不执行了,
* 除非去唤醒CPU,但是频繁的唤醒会导致手机消耗大量的电量,缩短待机时间。
*/
TimerTask task = new TimerTask(){
public void run(){
// 这句日志可以打印
Log.d("TTT", "我是延时日志");
// 下面这个改变背景的无法打印,因为子线程不能直接更改UI
//mTv3Second.setBackgroundColor(Color.parseColor("#00FF00"));
// 更改的包UI的操作我们这里放到handler里面就可以成功执行
handler.sendEmptyMessage(1);
}
};
Timer timer = new Timer();
timer.schedule(task, 3000);
// =========== 第一种 TimerTask+Timer 延时器
.
.
** 2、第二种 线程**
// =============== 第二种 线程
new Thread(new Runnable(){
public void run(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("TTT","线程延迟了3秒");
handler.sendEmptyMessage(2); //告诉主线程执行任务
}
}).start();
// =============== 第二种 线程
.
.
3、第三种 handler postDelayed
//============== 第三种 handler postDelayed
new Handler().postDelayed(new Runnable(){
public void run() {
mTvHandlerPostDelayed.setBackgroundColor(Color.parseColor("#0000ff"));
}
}, 3000);
// ============= 第三种 handler postDelayed
.
.
** 4、第四种、AlarmManager,适用于定时比较长远的时间,例如闹铃 **
5、第五种 android5.0 JobScheduler
.
.
二、简单demo图
当前机器较差,没办法准确显示对应的延时时间,所以这图看个大概就好
GIF.gif
.
.
附上代码
XML
<?xml version="1.0" encoding="utf-8"?>
<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"
android:gravity="center_horizontal"
tools:context="com.amqr.delayedtimetest.MainActivity">
<TextView
android:id="@+id/mTv3Second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Timer+Task3秒后出Log和弹吐司"
android:padding="10dp"
android:background="#66ff0000"
android:layout_margin="10dp"
android:layout_centerHorizontal="true"
/>
<TextView
android:id="@+id/mTvNewThread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="newThread 出 Log"
android:padding="10dp"
android:background="#66ff0000"
android:layout_margin="10dp"
android:layout_centerHorizontal="true"
/>
<TextView
android:id="@+id/mTvHandlerPostDelayed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="HandlerPostDelayed 背景变蓝"
android:padding="10dp"
android:background="#66ff0000"
android:layout_margin="10dp"
android:layout_centerHorizontal="true"
/>
</LinearLayout>
.
.
.
MainActivity
public class MainActivity extends Activity implements View.OnClickListener {
private TextView mTv3Second;
private TextView mTvNewThread;
private TextView mTvHandlerPostDelayed;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:
mTv3Second.setBackgroundColor(Color.parseColor("#000000"));
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTv3Second = (TextView) findViewById(R.id.mTv3Second);
mTv3Second.setOnClickListener(this);
mTvNewThread = (TextView) findViewById(R.id.mTvNewThread);
mTvNewThread.setOnClickListener(this);
mTvHandlerPostDelayed = (TextView) findViewById(R.id.mTvHandlerPostDelayed);
mTvHandlerPostDelayed.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.mTv3Second:
// =========== 第一种 TimerTask+Timer 延时器
/**
* Timer类可以用来计划执行循环执行任务,但是如果手就休眠了,任务就不执行了,
* 除非去唤醒CPU,但是频繁的唤醒会导致手机消耗大量的电量,缩短待机时间。
*/
TimerTask task = new TimerTask(){
public void run(){
// 这句日志可以打印
Log.d("TTT", "我是延时日志");
// 下面这个改变背景的无法打印,因为子线程不能直接更改UI
//mTv3Second.setBackgroundColor(Color.parseColor("#00FF00"));
// 更改的包UI的操作我们这里放到handler里面就可以成功执行
handler.sendEmptyMessage(1);
}
};
Timer timer = new Timer();
timer.schedule(task, 3000);
// =========== 第一种 TimerTask+Timer 延时器
break;
case R.id.mTvNewThread:
/* try {
Thread.sleep(3000); // 这种方式不是很好
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("TTT","线程延迟了3秒");*/
// 像上面的那种写法写成下面这样会好一些一般来说
// =============== 第二种 线程
new Thread(new Runnable(){
public void run(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("TTT","线程延迟了3秒");
handler.sendEmptyMessage(2); //告诉主线程执行任务
}
}).start();
// =============== 第二种 线程
break;
case R.id.mTvHandlerPostDelayed:
//============== 第三种 handler postDelayed
new Handler().postDelayed(new Runnable(){
public void run() {
mTvHandlerPostDelayed.setBackgroundColor(Color.parseColor("#000000"));
}
}, 3000);
// ============= 第三种 handler postDelayed
break;
// 第4种 AlarmManager,适用于定时比较长远的时间,例如闹铃
// 第5种 Android 5.0开始有了一个新的实现方案:JobScheduler
}
}
}
本篇完。