等待一个Runnable完成,然后再运行另一个Runnable

我有一个带有主标签页活动的Android应用程序,并且在单个标签页内有多个活动。在我的主要活动的onCreate()中,我有一个可运行的内容,它创建了一个列表,而在各个活动中,我都使用了此列表。

在各个活动的onCreate()中,我还具有在列表上运行的Runnable。但是,我需要这些Runnable仅在主选项卡活动的Runnable完成创建列表时才运行,否则我将得到一个空列表。我正在尝试找到一种优雅的方法。现在,在我的主活动的Runnable中,我设置了一个全局布尔变量isDone,在我的个人活动的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();

}

在其他人Runnablerun()方法需要等待的时候,类似这样:

synchronized (listCreatingRunnableObject) {

if (!listCreatingRunnableObject.getListsDone()) {

try {

listCreatingRunnableObject.wait();

} catch (InterruptedException e) {

// handle it somehow

}

}

}

为明确起见,两个synchronized块都需要在同一对象上同步,并且您必须在该对象上调用wait()notifyAll()。如果对象是Runnable,则它对于第一个对象是隐式的(如上面的代码所示),但是如果是活动对象,则在两种情况下都需要显式使用活动对象。

以上是 等待一个Runnable完成,然后再运行另一个Runnable 的全部内容, 来源链接: utcz.com/qa/419553.html

回到顶部