美文网首页安卓学习Android开发之路
安卓/android的延时/定时方式

安卓/android的延时/定时方式

作者: 阿敏其人 | 来源:发表于2016-07-31 08:51 被阅读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
            }
        }
    }
    
    

    本篇完。

    相关文章

      网友评论

      • 捡淑:JobScheduler有点意思

      本文标题:安卓/android的延时/定时方式

      本文链接:https://www.haomeiwen.com/subject/unrdkttx.html