确保两个线程在执行一段代码之前完成执行

时间:2012-05-09 08:52:03

标签: android

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

  1. 使用后台主题从数据库成功查询主题文本。
  2. 使用主线程成功检索View的维度。 主题文本和View的维度都存储为Activity的成员变量。
  3. 对于1),我只是在Activity的onCreate()和doInBackground中启动AsyncTask,我查询DB以获取Subject文本并将其存储在Activity的成员变量中。

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

    无法保证哪一个(1或2)将首先完成。

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

3 个答案:

答案 0 :(得分:2)

我认为您可以使用CountDownLatch

旨在解决这些问题。

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

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

在您的每项操作中,完成后,在countDown实例上调用latch

latch.countDown();

在某些情况下,如果您的两个主题都必须完整,请在await实例上调用latch

latch.await(); // Will block. Will resume after both thread are completed

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

onPostExecute(){

    queryComplete = true;

    checkThreadCompleted();

}


onPostExecute(){

    viewMeasured = true;

    checkThreadCompleted();

}

private void checkThreadCompleted(){

     if(queryComplete && viewMeasured){
         //Do something
     }
}