Android handler / 循环定时执行任务 / Timer开启循环任务

本文探讨了Android中Handler机制用于线程间通信的方式,通过示例展示了如何在主线程与工作线程间传递消息。同时,将Handler与读写锁在传输频率和CPU使用率方面的表现进行了对比,结果显示两者在性能上接近,但Handler的CPU使用率略高。文章还提到了HandlerThread与普通Thread的区别,以及如何使用Handler实现循环执行任务的两种方法:sendEmptyMessageDelayed和postRunnable,以及如何控制它们的停止。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Handler概念

Handler允许你发送和处理Message和Runnable object通过关联的一个线程的MessageQueue.

Handler线程间传递消息机制

调用示例1

主函数

 myThread = new MyThread();
 Message message = mHandler.obtainMessage();
 message.what = 1;
 mHandler.sendMessage(message);

线程类 MyThread

线程类一创建,就会实例化MyHandler,线程创建后使用start(),线程就启动了吗?

private class MyThread{
   

        public MyThread() {
   
            final HandlerThread thread =
                    new HandlerThread("myThread",
                            Thread.MIN_PRIORITY);
            thread.start();
            mHandler = new MyHandler(thread.getLooper());
        }

        private class MyHandler extends Handler{
   
            public MyHandler(Looper looper) {
   
                super(looper);
            }
            @Override
            public void handleMessage(Message msg) {
   
                super.handleMessage(msg);
                switch (msg.what){
   
                    case 1:
                        try {
   
                            Log.i(TAG, "handleMessage: " + msg.what);
                            String str = URLDecoder.decode(msg.obj.toString(), "UTF-8");
                            Log.d(TAG, "handleMessage: " + str);
                        } catch (Exception e) {
   
                            Log.e(TAG,e.getMessage());
                            e.printStackTrace();
                        }
                        break;
                }
            }

        }
    }

测试结果

2023-04-04 20:31:22.181 28448-32076/cn.jj.restart I/JJWorld: handleMessage: 1
2023-04-04 20:31:22.181 28448-32076/cn.jj.restart E/JJWorld: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference

线程间通信 Handler与读写锁对比1

Handler每秒传输120次消息 通过读写锁每秒传输120次消息对比。

RandomStringUtils工具类来自于此库 implementation ‘org.apache.commons:commons-lang3:3.7’

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
   
    private MyThread myThread;
    private Handler mHandler;
    private String TAG = "JJWorld";
    private Button button;
    private int interval = 0;
    private int interval2 = 0;
    private ArrayList<String> list = new ArrayList<String>();
    private ArrayList<String> list2 = new ArrayList<String>();
    private ReentrantReadWriteLock readWriteLock =new ReentrantReadWriteLock();
    private Button button2;
    private Integer period = 8;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myThread = new MyThread();
        Message message = mHandler.obtainMessage();
        message.what = 1;
        message.obj = 1;
        mHandler.sendMessage(message);
        initView();
        button.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    private void initView() {
   
        button = (Button) findViewById(R.id.button);
        button2 = (Button) findViewById(R.id.button2);
    }

    @Override
    public void onClick(View v) {
   
        switch (v.getId()) {
   
            case R.id.button:
                new Timer()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学知识拯救世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值