我正在尝试编写一个代码,直到出现结果(由服务提供)或一秒过去。
我的代码可以检测到结果变量的更改,但是无法检测到对“等待”变量的更改。我在使用Handler.postDelayed()执行的可运行文件中更新了等待变量。我曾尝试使用@Volatile,但还是没有运气。
var waiting = true
var r = Runnable {
waiting=false
Log.d("Timeout", "timeout")
}
val handler = Handler()
handler.postDelayed(r,1000)
while(returnCall==null && waiting){continue;}
// handler.removeCallbacksAndMessages(null)
我期望服务中的对象,或者等待一秒钟后跳过该过程。该代码永远不会超出while语句。永远不会将“超时”打印到Logcat。
如果已分配returnCall,则代码会继续执行,并且Runnable将按预期执行(将超时输出到Logcat)。
编辑: 我在回调函数中使用此代码
var jsInterfaceCallback = object : MyJsInterface.myJsInterfaceCallback(){
override fun onCommand (command : String, data : HashMap<String, Any>) : MutableMap<String, Any>{
returnCall = null
// Pass intent to service
var waiting = true
var r = Runnable {
waiting=false
Log.d("Timeout", "timeout")
}
val handler = Handler()
handler.postDelayed(r,1000)
while(returnCall==null && waiting){continue;}
// handler.removeCallbacksAndMessages(null)
if(returnCall != null){
return returnCall!!
}
return mutableMapOf()
}
}
答案 0 :(得分:3)
由于您正在使用自旋锁来阻塞线程,因此发布在同一线程上的Runnable
将没有执行的机会(该线程一直在忙于进行while
循环)
您应该编写回调函数来执行后续操作,并在超时或服务产生结果时调用它,而不是使用while
循环来检测变量更改。
fun callback(result : YourResultType?)
{
if(result != null)
{
//handle the result produced by the service
}
else
{
//timeout, do what ever you want to follow up
}
}
var r = Runnable {
Log.d("Timeout", "timeout")
callback(null)
}
val handler = Handler()
handler.postDelayed(r,1000)