蓝牙分包发送消息
有问题可以加QQ讨论:1070800492
- 1.新建一个消息队列:
private ArrayBlockingQueue<String> msgSendQueue;//发消息的消息对列
private ArrayBlockingQueue<String> msgRecvQueue;//接收消息的队列
- 2.进行初始化:
//!< 初始化接收和发送消息队列
msgSendQueue = new ArrayBlockingQueue<String>(50);
msgRecvQueue = new ArrayBlockingQueue<String>(100);
- 3.接收需要发送消息并存入消息队列中
msgSendQueue.offer(action);//action为需要发送消息
- 4.通过线程发送消息
private class SendThread implements Runnable {
@Override
public void run() {
while(isStartDemonService) {
String msgString = null;
try {
msgString = msgSendQueue.take();//获取消息队列的消息
} catch (InterruptedException e) {
e.printStackTrace();
}
//发送消息的方法:大家可以不要在意,注重怎么拿到消息队列的消息就行
sendMsg();
}
}
}
- 5.结束其他线程传来的消息:
- 只需要把消息放入消息队列就行。
msgRecvQueue.offer(msg);//msg是存放消息
- 6.用线程解析消息
private class DataParseThread implements Runnable {
@Override
public void run() {
while(true) {
try {
String msg=msgRecvQueue.take(); //取消息
}
}
}
- 7.因为我们接收消息和发送消息都用到了线程。大家注意观察:我是用的implements Runnable而不是extends Thread;因为消息需要完成行。所以大家也知道为什么要用实现Runable接口的方式了吧。
- 8.当然还有注意的是:我们并不知道什么时候开始接收消息,也不知道什么时候消息队列有消息需要发送。所有用来while(true)的方式监听我们的消息队列。
- 9.综上所诉。所以我们的线程在一开始的就开始调用了:在初始化消息队列的时候就开启线程了
//!< 初始化接收和发送消息队列
msgSendQueue = new ArrayBlockingQueue<String>(50);
msgRecvQueue = new ArrayBlockingQueue<String>(100);
//!< 建立接收数据解析线程
new Thread(new DataParseThread()).start();
new Thread(new SendThread()).start();
- 10.当然我们的线程不肯能一直开启。当我们退出程序的时候。或者我们不需要消息队列的时候是不是就应该关闭线程呢?
isStartDemonService = false;//boolean的值,在while(isStartDemonService)使用。
//这里是不是线程就关闭了呢?
当然我们消息肯定是整个消息的接收和发送:所有我们就需要用到了同步:
public synchronized boolean setMessage() {
boolean retStatus=true;
this.msgSendQueue.offer(action);
return retStatus;
}
所有这个synchronized很关键
题外话:谢谢大家观看,有不足之处欢迎大家一起讨论;码字不易,大家喜欢,麻烦点赞哦。
灵魂三问:
- 有没有觉得技术得不到系统的提升,技术成长慢?
- 有没面试懵逼,升职加薪难?
- 有没有想过去大一点的世界看看?
有期望JAVA技术巩固的、Android知识进阶的、期望升职加薪的、Android面试技巧的、大厂面试真题的;大家可以加我QQ哦:1070800492。我们一起学习,一起进步!
重要的事情说三遍:
- 学习、挣钱、自由
- 学习、挣钱、自由
- 学习、挣钱、自由
疫情当下,唯有自强