Android子线程与子线程的通信
16lz
2021-01-23
原理也是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(); } }); }}
查看日志打印
符合预期,子线程1成功接收到了子线程2的消息
更多相关文章
- android子线程中刷新界面控件
- Android客户端与云服务器进行网络通信
- Android应用程序键盘(Keyboard)消息处理机制分析(10)
- android 主线程和子线程之间的消息传递
- Android应用程序键盘(Keyboard)消息处理机制分析(21)
- Android笔记:Android后台接口教程一(从零开始学习Android后台接口)A
- android编程之在单线程模型中Message、Handler、Message Queue、