是否可以在同一线程中等待回调?

时间:2018-12-30 07:44:32

标签: java android android-webview

这是东西。在UI线程中时,我在UI线程中发布了一个异步回调。是否可以等待回调并同步执行

一个很好的例子是在UI线程中等待WebView的评估Java脚本。

//In the UI thread
webView.evaluateJavascript("javascript:.....", callback)
//Needs to be sure that the callback is completed
dosomething()

我知道建议将dosomething()放在callback内。但是在某些情况下,这并不安全,就像在onPause()中执行操作一样。如果您不同步等待,则可以随时破坏视图。

override fun onPause(){
    webView.evaluateJavascript("javascript:.....", callback)
    doNotContinueUntilCallbackCompletes()
    super.onPause()
}

由于我们与回调位于同一个线程中,所以CountDownLatch无效。它阻止了整个UI线程。而且由于我们需要访问webView,所以我们必须在UI线程中创建callback

那么正确的方法是什么?

1 个答案:

答案 0 :(得分:0)

在一般情况下不是,不是。一方面,回调不一定是异步的。回调可能在同一线程上发生。在这种情况下,等待将立即导致该线程死锁。很少异步的回调示例是访问者模式,该模式遍历对象层次结构。另一个可能是像Volley这样的库,它在完成后会发回到主线程。

现在,如果您假设回调将被异步调用,那么您可以使用Future来等待它-或只是在回调中发出信号量(或多或少会成为Future的工作)。

但是,您几乎永远都不想这样做,并且从不从UI线程执行。如果从UI线程执行此操作,则整个应用程序将冻结。这就是为什么要在其他线程上执行操作。在这种情况下等待它总是一个错误。如果不是来自UI线程,则有一些用例(主要是在与执行自己的线程的库进行交互时),但是如果您要在另一个线程上工作并获得回调,为什么不做呢?现在在该线程上工作吗?

此外,像这样在onPause中执行此操作可能会使看门狗计时器跳闸,并导致整个应用崩溃。生命周期功能的运行时间有限。