gpt4 book ai didi

java - 在运行另一个 Runnable 之前等待 Runnable 完成

转载 作者:IT王子 更新时间:2023-10-28 23:34:56 28 4
gpt4 key购买 nike

我有一个带有主选项卡 Activity 的 Android 应用,以及各个选项卡中的多个 Activity 。在我的主要 Activity 的 onCreate() 中,我有一个创建列表的可运行文件,在各个 Activity 中,我使用了这个列表。

在单个 Activity 的 onCreate() 中,我还有对列表进行操作的 Runnables。但是,我需要这些 Runnable 仅在主选项卡 Activity 的 Runnable 完成创建列表时运行,否则我会得到一个空列表。我试图找到一种优雅的方式来做到这一点。现在,在我的主要 Activity 的 Runnable 中,我正在设置一个全局 boolean 变量 isDone,而在我的个人 Activity 的 Runnable 中,我正在等待通过 while 循环设置 isDone。这可行,但可能不是最好的方法。

有什么想法吗?

谢谢。

编辑:我正在尝试以下代码,但出现运行时错误:

在我的 MainActivity 的 Runnable 中:

mainRunnable = new Runnable() {
public void run() {
try {
generateList();
synchronized(this) {
listDone = true;
notifyAll();
}
} catch (Exception e) {
Log.e("BACKGROUND_PROC", e.getMessage());
}
}
};
Thread thread = new Thread(null, mainRunnable, "Background");
thread.start();

在我的 OtherActivity 的 Runnable 中:

otherRunnable = new Runnable() {
public void run() {
synchronized(MainActivity.mainRunnable) {
if (!MainActivity.getListDone()) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
}
};
Thread thread = new Thread(null, otherRunnable, "Background");
thread.start();

mainRunnable 似乎完全运行,但 otherRunnable 似乎导致应用程序崩溃。我收到以下错误消息:

01-10 15:41:25.543: E/WindowManager(7074): Activity com.myapp.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40539850 that was originally added here
01-10 15:41:25.543: E/WindowManager(7074): android.view.WindowLeaked: Activity com.myapp.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40539850 that was originally added here

最佳答案

您可以使用 waitnotify 方法。

为此,需要有一些全局可访问对象,此时程序中的其他任何东西都没有使用其锁。我假设创建列表的 Runnable 本身可以扮演这个角色。

所以你可以在创建列表的 Runnable 类中添加类似这样的内容:

private boolean listsDone = false;

boolean getListsDone() {
return listsDone;
}

在创建列表之后立即对其 run() 方法进行类似处理:

synchronized (this) {
listsDone = true;
notifyAll();
}

对于其他 Runnables 的 run() 方法,在它们需要等待的地方也有类似的情况:

synchronized (listCreatingRunnableObject) {
if (!listCreatingRunnableObject.getListsDone()) {
try {
listCreatingRunnableObject.wait();
} catch (InterruptedException e) {
// handle it somehow
}
}
}

更新:澄清一下,两个 synchronized block 需要在同一个对象上同步,并且您必须调用 wait()notifyAll() 在该对象上。如果对象是Runnable,那么它对于第一个可以是隐式的(如上面的代码),但如果是 Activity ,你需要在这两种情况下显式使用 Activity 对象。

关于java - 在运行另一个 Runnable 之前等待 Runnable 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8799373/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com