Android doAsync在一段时间后不再被调用
我通常在后台进行以下udp联网:Android doAsync在一段时间后不再被调用,android,kotlin,anko,Android,Kotlin,Anko,我通常在后台进行以下udp联网: 每5秒钟请求一次硬件组件的状态 当用户按下按钮时发送命令 虽然到目前为止一切正常,但是doAsync主体在大约15秒后不再被调用 我的函数如下所示: // handler function, that calls sendRquest every 5 seconds val handler = Handler() val runnable = object : Runnable { override fun run() { sendR
- 每5秒钟请求一次硬件组件的状态
- 当用户按下按钮时发送命令
doAsync
主体在大约15秒后不再被调用
我的函数如下所示:
// handler function, that calls sendRquest every 5 seconds
val handler = Handler()
val runnable = object : Runnable {
override fun run() {
sendRequest(message)
handler.postDelayed(this, 5000)
}
}
handler.postDelayed(runnable, 500)
// function that is called every 5 sec
private fun sendRequest(message: String) {
val ip = getGlobalIP()
doAsync {
var run = true
//some udp stuff
}
}
当我调试时,我可以看到valip=
行被调用,var run=
行在这15秒后没有被调用
我等了大约一分钟,但是不再调用doAsync
主体
有人知道为什么吗
*编辑:*
以下是完整的doAsync
正文:
private fun sendRequest(relay: Relay, message: String, callback: (String, Relay) -> Unit) {
val test = 0
doAsync {
var run = true
val ipAddress = InetAddress.getByName(relay.ip)
try {
val packet = DatagramPacket(message.toByteArray(), message.length, ipAddress, relay.port!!)
val udpSocket = relay.socket!!
udpSocket.send(packet)
while (run) {
try {
val newMessage = ByteArray(8000)
val newPacket = DatagramPacket(newMessage, newMessage.size)
Log.i("UDP client: ", "about to wait to receive")
udpSocket.receive(newPacket)
val response = String(newMessage, 0, newPacket.length)
Log.d("Received text", response)
uiThread {
callback(response, relay)
}
} catch (e: IOException) {
Log.e("UDP client error", "error: ", e)
toast(e.message!!)
uiThread {
run = false
}
throw IOException(e)
}
}
} catch (e: IOException) {
e.printStackTrace()
toast(e.message!!)
}
}
}
anko的
doAsync
在内部SchedulerService
上运行
主要的问题是你的doAsync
调用是否结束,因为在某个时刻,它可能有足够多的调用同时运行,以至于安卓干脆决定不安排更多线程,直到一些旧线程结束
如果看不到
doAsync
调用的全部内容,就无法给出更具体的答案。具有将套接字存储在异步块之外的字段
运行async启动套接字一次,然后就可以使用udpSocket.send()
通过套接字发送数据包(它是非阻塞的)
否则,您可以在收到一个响应(如果您确定这足够)后终止套接字,以释放线程。我在问题中添加了整个主体是的,这将每隔5秒创建一个新线程,该线程不会结束,除非在读取套接字时发生异常。Android可能会在3次迭代后停止启动新线程,因为您尝试创建的线程数超过了所有侦听同一套接字的内核数。好吧,那么我应该做些什么不同呢?我对udp内容和异步方法调用非常陌生,但不知道您实际要做什么,也无法回答这个问题。为什么你每5秒发送一条消息,然后一直等待任何新消息?我的目标是获取(或更好的多个)硬件交换机的状态,并在应用程序中显示当前状态。我不太了解网络方面的东西,所以可能我做得完全错了。。。。