Android用Handler让主线程向子线程发送消息

本文介绍如何在Android应用中为子线程手动创建Looper实例,并通过Looper.loop()阻塞线程来处理消息。文章展示了如何在子线程中创建Handler对象,并实现消息处理,最后讨论了如何正确地结束Looper以释放资源。

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

      核心思想:为子线程手动创建looper对象,绑定mQueue,建立持有这个mQueue的handler对象,并调用looper.loop()方法阻塞线程,等待接收到消息后交给handler处理,使用完成后要调用looper.quit()结束线程,释放资源


public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_send;
    private Handler handler;
    private Looper looper;

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

    }

    private void initSubThread() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Looper.prepare();//把main thread中自动执行的方法手动执行,为SubThread绑定Looper和消息队列mQueue
                looper = Looper.myLooper();//从子线程获取和子线程绑定的looper对象
                handler = new Handler() {//这个在子线程中创建的handler是绑定到子线程中的
                    @Override
                    public void handleMessage(Message msg) {
                        Toast.makeText(MainActivity.this, "在subThread中收到了:"+msg.obj, Toast.LENGTH_SHORT).show();//Toast底层依靠的就是looper环境 因为现在子线程有了looper环境,所以现在子线程也可以弹Toast
                    }
                };
                Looper.loop();//手动开启loop()方法用里面的无尽循环阻塞线程 等待接收消息,收到消息后就给handler处理
                Log.w("sub Thread", "我执行了子线程就结束了");
            }
        }).start();
    }

    private void initView() {
        btn_send = (Button) findViewById(R.id.btn_send);

        btn_send.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_send:
                send();
                break;
        }
    }

    private void send() {
        handler.obtainMessage(1,"main thread 发送的").sendToTarget();
    }

    @Override
    protected void onDestroy() {
            super.onDestroy();
//        handler.getLooper().quit();//在MainActivity destroy前调用子线程looper.quit()结束子线程 释放资源
        looper.quit();//这个looper和上一句的looper是同一对象  效果相同
    }
}




现在都在用 xMind 很少发东西了,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值