handler.postDelayed无法更新布尔变量

时间:2019-01-08 02:08:50

标签: android kotlin

我正在尝试编写一个代码,直到出现结果(由服务提供)或一秒过去。

我的代码可以检测到结果变量的更改,但是无法检测到对“等待”变量的更改。我在使用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()
    }
}

1 个答案:

答案 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)