Java 在Android中使用wait()函数时如何同步执行?

Java 在Android中使用wait()函数时如何同步执行?,java,android,Java,Android,在Android应用程序中执行以下代码时,setText发生在从另一个服务调用mainActivity.notify()之后。因此,似乎mainActivity.wait()在setText之前执行,导致setText被等待 这可能是什么原因,以及如何使Toast在mainActivity.wait()之前执行,以便在mainActivity等待时显示setText public static Activity mainActivity; .... startButton.setText("Pr

在Android应用程序中执行以下代码时,setText发生在从另一个服务调用mainActivity.notify()之后。因此,似乎mainActivity.wait()在setText之前执行,导致setText被等待

这可能是什么原因,以及如何使Toast在mainActivity.wait()之前执行,以便在mainActivity等待时显示setText

public static Activity mainActivity;
....
startButton.setText("Processing...");
synchronized(MainActivity.mainActivity) {
                try {
                    mainActivity.wait();
                } catch (InterruptedException e) {
                }
            }
startButton.setText("Start");

首先,永远不要对活动进行静态引用。这几乎可以肯定是内存泄漏。如果你认为你需要,你的整个应用程序的架构几乎肯定是错误的,或者你不知道如何使用上下文

其次,与其他GUI操作系统一样,底层Android也是由事件循环驱动的。通过挂起主线程,可以阻止事件循环执行,从而冻结整个应用程序。特别是如果不运行事件循环,应用程序将永远不会重新绘制


第三,你不能等到祝酒词出现。祝酒词由系统本身显示,当它决定显示时,它会显示,例如,屏幕上可能已经有其他祝酒词。在显示祝酒词时,没有通知的机制。干杯的目的是点燃并忘记,如果你需要更强大的东西,你需要自己写。

你可以使用Thread.sleep方法

try {
    Thread.sleep(1000);         
} catch (InterruptedException e) {
   e.printStackTrace();
}

你在冻结UI线程吗?为什么?不能使主(UI)线程等待。没有理由这样做,Android框架也不允许这样做。它会因为你的应用程序没有响应而杀死你。“你想在这里完成什么?”大卫瓦瑟我明白。我的MainActivity仅等待1-2秒,直到服务完成处理,以便显示服务生成的结果。@cricket\u 007我的MainActivity仅等待1-2秒,直到服务完成处理,以便显示服务生成的结果。你怎么知道它等待了那么久?你是在手动休眠线程吗?1:我将尝试了解更多信息并删除它。第二:我的MainActivity仅等待1-2秒,直到服务完成处理,以便它可以显示服务生成的结果。第三:我知道这是为了祝酒。但其他事情,如更改按钮上的文本,其行为也类似[在调用notify()后执行,即使它是在wait()之前写入的]。使用wait和notify等待服务完成是错误的。服务使用相同的线程,因此它永远不会发生。如果需要通知服务完成计算,请使用绑定服务和回调。您永远不应该在android(或任何其他基于gui的框架)中等待主线程,谢谢。这就是为什么我通过在服务中创建另一个线程来进行处理。我将研究你建议的方法,并尝试按照你所说的实施。然而,令人惊讶的是,为什么执行不同步。当我在wait()之前调用setText时,为什么它会在从服务中调用notify()之后执行。因为在事件循环处理下一个事件之前,应用程序不会重新绘制。直到主线程从应用程序中调用的任何函数返回事件循环,才会发生这种情况。调用Set text时会调用它,但在下次重新绘制之前,结果不会显示在屏幕上