Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android doAsync在一段时间后不再被调用_Android_Kotlin_Anko - Fatal编程技术网

Android doAsync在一段时间后不再被调用

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

我通常在后台进行以下udp联网:

  • 每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秒发送一条消息,然后一直等待任何新消息?我的目标是获取(或更好的多个)硬件交换机的状态,并在应用程序中显示当前状态。我不太了解网络方面的东西,所以可能我做得完全错了。。。。