原理也是Android异步消息处理机制,请看我的这篇博客

https://blog.csdn.net/yh18668197127/article/details/86224318

 

示例代码

接收信息的线程:

public class Runnable1 implements Runnable {    private static final String TAG = "Runnable1";    private Handler handler;    public Handler getHandler() {        return handler;    }    @SuppressLint("HandlerLeak")    @Override    public void run() {        Log.i(TAG, "run: 线程1开始");        Looper.prepare();        handler = new Handler(){            public void handleMessage(Message msg) {                //这里处理消息                Log.i(TAG, "handleMessage:收到消息 "+msg.what);                //只接受一次消息就退出Looper循环                handler.getLooper().quit();            };        };        Looper.loop();        Log.i(TAG, "run: "+Process.myTid());    }}

 传递信息的线程:

public class Runnable2 implements Runnable {    private static final String TAG = "Runnable2";    private Handler handler;    public Runnable2(Handler handler) {        this.handler = handler;    }    @Override    public void run() {        Log.i(TAG, "run: 线程2开始");        Message message=new Message();//        Message message=Message.obtain();(这种方法更好,节省资源)        message.what=1;        handler.sendMessage(message);        Log.i(TAG, "run: "+Process.myTid());    }}

调用处:第一个button开启接收线程,第二个button开启发送线程

//子线程和子线程通信public class Main2Activity extends AppCompatActivity {    private static final String TAG = "Main2Activity";    private Runnable1 runnable1;    private Runnable2 runnable2;    private Handler r1Handler;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main2);                runnable1=new Runnable1();        Button button2=findViewById(R.id.button2);        button2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //接收信息的线程                new Thread(runnable1).start();                //该线程用于两个通信线程之间Handler的传递工作                new Thread(new Runnable() {                    @Override                    public void run() {                        Log.i(TAG, "run: 该线程用于两个通信线程之间Handler的传递工作");                        r1Handler=runnable1.getHandler();                        if (r1Handler==null){                            try {                                Thread.sleep(250);                                r1Handler=runnable1.getHandler();                            } catch (InterruptedException e) {                                e.printStackTrace();                            }                        }                        runnable2=new Runnable2(r1Handler);                    }                }).start();            }        });        Button button3=findViewById(R.id.button3);        button3.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //传递信息的线程                new Thread(runnable2).start();            }        });    }}

 

查看日志打印

Android子线程与子线程的通信_第1张图片

符合预期,子线程1成功接收到了子线程2的消息 

更多相关文章

  1. android子线程中刷新界面控件
  2. Android客户端与云服务器进行网络通信
  3. Android应用程序键盘(Keyboard)消息处理机制分析(10)
  4. android 主线程和子线程之间的消息传递
  5. Android应用程序键盘(Keyboard)消息处理机制分析(21)
  6. Android笔记:Android后台接口教程一(从零开始学习Android后台接口)A
  7. android编程之在单线程模型中Message、Handler、Message Queue、

随机推荐

  1. Android(安卓)GPS架构分析(三)
  2. Android开发:在Android(安卓)apk中调用Ope
  3. Android(安卓)SQLite数据存储
  4. 【Android(安卓)Camera】之 Preview
  5. Android(安卓)调用堆栈跟踪
  6. Android事件拦截机制(一)
  7. Android拍照获得图片URI为空的处理方法
  8. Android(安卓)版本代号
  9. 【原创】Android仿新浪微博的“更多”页
  10. 使用 IntelliJ 查看 Android(安卓)源码