【问题标题】:How to make sure a task starts its execution only after a previous asynchronous task has completed its execution?如何确保任务仅在前一个异步任务完成执行后才开始执行?
【发布时间】:2016-06-30 22:27:16
【问题描述】:

我有两个任务 - task1()task2()task1() 从 Internet 获取一个值并将其添加到名为 numint 变量中。 task1()task2() 都可以访问变量 numtask2() 只是应该打印变量 num 的值。

但这里的问题是,在从 Internet 获取值之前,num 变量被打印出来。

int num = 0;
public static void main(String[] args)
{
     task1();
     task2();
}

public static void task1()
{
    int fetchedValue;
    rootRef.addListenerForSingleValueEvent(new ValueEventListener() {

        public void onDataChange(DataSnapshot snapshot) {
            fetchedValue = Integer.parseInt(snapshot.getValue().toString());
            num = num + fetchedValue ;
        }

        public void onCancelled(FirebaseError arg0) {
            System.out.println("cancelled");
        }
    });
    num = num + fetchedValue;

}

public static void task2()
{
    System.out.println("Updated number : "+num);
}

【问题讨论】:

  • 从 task1() 的 onPostExecute() 调用 task2()。
  • 我使用Firebase不是异步任务。
  • 使用EventBus 在第一个任务结束时发布一个事件,并在收到该事件后启动第二个任务。
  • 如您所写,task1 是同步的。请在代码中显示>>
  • onDataChange()方法结束时调用task2

标签: java firebase firebase-realtime-database


【解决方案1】:

您可以使用布尔值来确定是否已获取该值。

这两个任务都可以访问这个布尔值。如果 task1 已完成获取,则将布尔值更改为 true。 task2 循环检查获取是否完成,如果 num 已获取,则打印 num

【讨论】:

  • 这听起来不错,但不知道这是否是理想的解决方案,因为如果价值从未从互联网到达或到达很晚怎么办。这会不会永远循环或循环很长时间。
  • 在这种情况下,您可以使用 int 或 char 来表示不同的获取结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
相关资源
最近更新 更多