问题遇到的现象和发生背景
最近在做一个UDP广播,并接收反馈信息进行显示输出,设置的超时时间是6秒,但在接收反馈信息的6秒中,我不能进行其它的操作,我必须等6秒结束才能操作其它数据。应该是线程阻塞的问题,DatagramSocket的receive()方法会阻塞线程,请问有什么办法可以解决吗?在uniapp中
用代码块功能插入代码,请勿粘贴截图
return new Promise((resolve, reject) => {
console.log("----------------------- bindBroadcast -----------------------")
//引入需要用到的安卓包
let DatagramPacket = plus.android.importClass('java.net.DatagramPacket'); //udp接收信息引用的java类
let DatagramSocket = plus.android.importClass('java.net.DatagramSocket'); //udp创建udp引用java类
let InetAddress = plus.android.importClass('java.net.InetAddress'); //绑定ip引用java类
let NetworkInterface = plus.android.importClass('java.net.NetworkInterface'); //获取主机ip
let JString = plus.android.importClass('java.lang.String'); //字符串转换类
let socket;
let port = that.port; //广播端口
let getPort = that.getPort; //本机端口
let timeout = 6000; //超时时间
let address = that.ip;
let getData = [];
try {
if (DatagramSocket == undefined) {
return;
}
// 创建广播地址
let ip = InetAddress.getByName(address);
// 绑定本机接收UDP反馈消息的端口号
socket = new DatagramSocket(getPort);
// 设置接收超时时长
socket.setSoTimeout(timeout);
// 发送广播数据
let sendData = Array.prototype.slice.call((new Buffer(`hello server`)), 0);
let sendPacket = new DatagramPacket(sendData, sendData.length, ip, port);
console.log('广播地址:' + ip.getHostAddress(), '端口号:' + sendPacket.getPort())
socket.send(sendPacket);
// 接收数据
let isReceive = true;
while (isReceive) {
try {
// 设置接收缓存,需要用0填充,否则为 null 无法接收。
let buffer = new Array(1024).fill(0);
let packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
let data = new JString(packet.getData()).trim();
if (data.length == 0) {
// 接收超时,结束接收
isReceive = false;
} else {
console.log('=====收到数据======', data);
getData.push(data)
}
} catch (ex) {
socket.close();
isReceive = false;
console.log('接收数据失败:' + ex.message)
}
}
} catch (ex) {
console.log('========出错了=======', ex);
} finally {
if (socket != undefined) {
socket.close();
}
return resolve(getData)
}
})
我想要达到的结果
我想要在这个方法执行时,我可能操作别的方法。我尝试将它写成异步的方法,但还是不行