zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

android 定时器的实现比较

Android 实现 比较 定时器
2023-06-13 09:12:39 时间

大家好,又见面了,我是你们的朋友全栈君。

第一种,Handler+ thread

public class MainActivity extends Activity {

    TextView textView;
    int time;
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            textView.setText(msg.arg1 + "");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.test_time);
        textView.setText(time + "");
        new Thread() {
            @Override
            public void run() {
                int times = 0;
                while (true) {
                    try {
                        Thread.sleep(1000);
                        Message message = new Message();
                        message.arg1 = times;
                        times++;
                        handler.sendMessage(message);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

这种明显的是使用了另外一个线程,在android开发中,速度是很重要的,开启线程都是需要进行消耗大量资源的,android不必web,他的资源有限,所以我们在不必要的时候,不要开启线程,结果是:

结果很简单

第二种:Handler + postDelyed

TextView textView;
    int time = 1000;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.test_time);

        System.out.println("Main  Name : "
                + Thread.currentThread().getName());
        handler.postDelayed(runnable, time);
    }

    Handler handler = new Handler();

    Runnable runnable = new Runnable() {
        int i = 0;

        @Override
        public void run() {
            System.out.println("Name : "
                    + Thread.currentThread().getName());
            textView.setText(i + "");
            handler.postDelayed(this, time);
            i++;
        }
    };

结果打印如下:

可以看出,这种的定时效果是在主线程中的并且实在MessageQuence中进行实现的:

 needWake = mBlocked && p.target == null && msg.isAsynchronous();
                Message prev;
                for (;;) {
                    prev = p;
                    p = p.next;
                    if (p == null || when < p.when) {
                        break;
                    }
                    if (needWake && p.isAsynchronous()) {
                        needWake = false;
                    }
                }
                msg.next = p; // invariant: p == prev.next
                prev.next = msg;
            }

这是android的源码,他确实没有启动线程

第三种:Handler+Timer+TimerTask

TextView textView;
    int time = 10000;
    int i;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.test_time);

        System.out.println("Main  Name : "
                + Thread.currentThread().getName());
//        handler.postDelayed(runnable, time);

        timer.schedule(timerTask,0,10000);

    }


    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            textView.setText(i++ + "");
        }
    };

    Timer timer = new Timer();
    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            System.out.println("Name : "
                    + Thread.currentThread().getName());
            Message message = new Message();
            handler.sendMessage(message);
        }
    };

打印图:

可以看出,这个也是自己启动了一个线程,实在线程中进行定时的

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/160058.html原文链接:https://javaforall.cn