1

当满足两个条件时,我需要执行一段代码。

  1. 使用后台线程从数据库中成功查询到主题文本。
  2. 使用主线程成功检索 View 的维度。主题文本和视图维度都存储为 Activity 的成员变量。

对于 1),我只需在 Activity 的 onCreate() 中启动 AsyncTask,然后在 doInBackground 中查询 DB 以获取主题文本并将其存储在 Activity 的成员变量中。

对于 2),我向 UI 线程发布了一个 Runnable,在 run() 中,我查询视图的维度并将其存储在 Activity 的成员变量中。也在 onCreate() 中完成。

无法保证哪个(1 或 2)会先完成。

因此我的问题是,在执行一段代码之前等待 1 和 2 完成的推荐模式是什么?

4

3 回答 3

2

我认为您可以使用CountDownLatch

它旨在解决此类问题。

首先,您需要在代码中的某处创建一个闩锁,在 1) 和 2) 之前的某处

CountDownLatch latch = new CountDownLatch(2); // wait for 2 threads;

在您的每个操作中,当它完成时,调用一个countDownonlatch实例

latch.countDown();

在某些时候,您的两个线程都必须完成,请await调用latch实例

latch.await(); // Will block. Will resume after both thread are completed
于 2012-05-09T08:58:12.333 回答
0

我认为当您在其 onPostExecute 中使用 Async 完成您的第一个任务时(因为它将在您的第一个任务完成时被调用),您可以在 UI 线程上发布可运行文件,或者直接获取视图的度量维度,然后执行您想要的代码.

于 2012-05-09T09:45:48.673 回答
0

我之前做的方法很简单。当线程完成时,我只是设置了一个布尔值。然后我从每个线程调用一个方法来检查两个值是否为真。有点像这样:

onPostExecute(){

    queryComplete = true;

    checkThreadCompleted();

}


onPostExecute(){

    viewMeasured = true;

    checkThreadCompleted();

}

private void checkThreadCompleted(){

     if(queryComplete && viewMeasured){
         //Do something
     }
}
于 2012-05-09T09:53:00.233 回答