安卓学习Android开发之路

安卓/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
        }
    }
}

本篇完。

上一篇下一篇

猜你喜欢

热点阅读