android两个子线程间通信
16lz
2021-01-24
android中主线程和子线程之间的通信是通过handler消息循环机制,主线程中的handler把子线程中的message发送给主线程中的looper,或者主线程中的handler通过post向looper发送一个runnable。looper默认存在于主线程中,子线程中是没有的。那怎么办呢?我们可以把looper绑定到子线程中,调用Looper.prepare()方法为该子线程生成looper,生成后调用Looper.loop()启动消息队列,并且在该子线程中创建一个handler。在另一个子线程中调用该handler发送消息。这样就可以实现子线程间的通信了。
示例代码:
private Handler handler;//子线程一class ThreadA implements Runnable{ private Handler mHandler; //run运行后才不为null在main里判断 public Handler getHandler(){ return mHandler; } @SuppressLint("HandlerLeak") @Override public void run() { Looper.prepare(); mHandler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 1: Log.e("线程A","线程B发过来消息了--"+msg.obj); break; } } }; Looper.loop(); } }//子线程二 class ThreadB implements Runnable{ @Override public void run() { Message mess=Message.obtain(); mess.what=1; mess.obj= "线程B"+System.currentTimeMillis(); handler.sendMessage(mess); } }
在activity onCreate方法里
ThreadA threadA = new ThreadA(); ThreadB threadb = new ThreadB(); new Thread(threadA).start(); if(threadA.getHandler() == null) { try { Thread.sleep(1000); handler = threadA.getHandler(); } catch (InterruptedException e) { e.printStackTrace(); } } new Thread(threadb).start();
运行即可。
更多相关文章
- 如果我是Android面试官九
- Android中的UI线程详解
- android连续调用setVisibility(View.VISIBLE)和setVisibility(Vi
- android用jdbc多线程操作sqlite小结
- Android多线程(三)HandlerThread源码原理解析
- [置顶] android ANR
- Android(安卓)Looper
- Android界面刷新的方法
- 使用线程更新UI