主线程与子线程之间相互通信

本文探讨了如何实现主线程向子线程发送消息的需求,重点介绍了HandlerThread类的作用和使用方法。通过示例代码展示了HandlerThread如何确保线程安全并避免空指针异常,同时给出了一个完整的主线程与子线程互相通信的例子。
摘要由CSDN通过智能技术生成

      在平时写程序时,我们一般都是在子线程中向主线程发送消息,从而完成请求的处理,这个很常见,不用多说了。那么有时候,我们也可能碰到这样子的一种需求:需要主线程来向子线程发送消息,希望子线程来完成什么任务。如果这样子应该怎么做呢?这就是这篇文章将要讨论的内容。

一、HandlerThread类

      主线程发送消息给子线程,通常思维逻辑就是:其实很简单,在主线程中实例化一个Handler,然后让他与子线程相关联(只要它与子线程的Looper相关联即可),这样子它处理的消息就是该子线程中的消息队列,而处理的逻辑都是在该子线程中执行的,不会占用主线程的时间。那么我们就来实现一下,看看这样子到底行得通还是行不通。新建项目,修改它的MainActivity的代码,如下即可:

 1 package com.example.handldertest;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.os.Handler;
 6 import android.os.Looper;
 7 import android.util.Log;
 8 import android.widget.TextView;
 9 
10 public class ThreadHandlerActivity extends Activity{
11     
12 
13     //创建子线程
14     class MyThread extends Thread{
15         private Looper looper;//取出该子线程的Looper
16         public void run() {
17          
18             Looper.prepare();//创建该子线程的Looper
19             looper = Looper.myLooper();//取出该子线程的Looper
20             Looper.loop();//只要调用了该方法才能不断循环取出消息
21         }
22     }
23     
24     private TextView tv;
25     private MyThread thread;
26     
27     
28     private Handler mHandler;//将mHandler指定轮询的Looper
29     
30     protected void onCreate(Bundle savedInstanceState) {
31             super.onCreate(savedInstanceState);
32             tv = new TextView(this);
33             tv.setText("Handler实验");
34             setContentView(tv);
35             thread = new MyThread();
36             thread.start();//千万别忘记开启这个线程
37             //下面是主线程发送消息
38             
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值