Android:runOnUiThread()Runnable Sequencing

时间:2014-06-26 02:36:47

标签: android multithreading java-native-interface handler runnable

我有两个JNI本机方法在我的UI中回调Java方法。

1)显示进度.. 2)取消进度

上述两个电话肯定是按顺序进行的。它们都调用Java方法来创建新的runnables,如下所示:

m_Activity.runOnUiThread( new Runnable()
{
  @Override
  public void run()
  {
    DisplayProgressUpdate( m_ProgressPercent );
  }
} );

-

m_Activity.runOnUiThread( new Runnable()
{
  @Override
  public void run()
  {
    m_Progress.dismiss();
  }
} );

我所看到的是,在进度更新runnable完成之前发生了dismiss runnable。我原以为是因为它们是按顺序调用的,因为它们都是在同一个(UI)线程上被请求的,它们也会按顺序发生。情况不是这样吗?

这就是我应该使用Handler之类的东西来同步/排序这些调用的原因吗?

编辑:好的,我实现了一个处理程序并仍然观察到相同的行为。实际上我的调试让我很困惑。看起来Dismiss Java代码在进度更新完成之前就已经发生了,但实际上它是Java调试打印,只要JNI调用Java方法发布到处理程序 - 而不是实际的可运行线程本身。所以.. tajonn07在某种程度上是正确的 - 在我有机会看到它之前对话框正在关闭,我的调试让我误入歧途。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

我怀疑你所看到的不是首先被执行的解雇,而是在显示之后它被执行得如此之快,甚至没有显示。

我建议使用处理程序。但即使使用处理程序,如果它在您的UI线程中,它将冻结您的屏幕。

它有点乱,但您可以使用处理程序将这两个代码块放在另一个线程中。这不是最干净的解决方案,但应该做到这一点!

答案 1 :(得分:0)

在android中的队列中没有添加runOnUiThread,在调用时立即调用它。      如果你想要队列/序列(即一个接一个),你必须使用Handler。