在安卓中链式执行两个异步任务的正确方法

4
我有两个异步任务,分别是任务1和任务2。
我需要先运行任务1,然后立即运行任务2,但我不想通过在任务1的onPostExecute实现中调用任务2来耦合这两个任务;因为我在其他情况下将任务1作为独立的任务使用。
是否有一种方法可以定义这两个异步任务而不将它们绑定在一起,并在特定情况下将它们链接起来?
非常感谢您的帮助。

你能否在任务1的onPostExecute中做一个简单的if-else,来启动/停止任务2? - Cԃաԃ
在第一个任务的onPostExecute方法中,您可以触发一个事件(意图、方法、处理程序等),以启动第二个任务。 - An-droid
@Cԃաԃ 这可能是一个可行的解决方案,但我正在尝试看是否有更简洁的方法来实现这个。 - Yash
@Yume117 - 我正在尝试不直接从任务1的onPostExecute中调用任务2。 - Yash
然后使用一个管理任务的服务,并使用广播接收器获取事件。 - An-droid
2个回答

0
你可以尝试这样做:
final Executor directExecutor = new Executor() {
  public void execute(Runnable r) {
    r.run();
  }
};
AsyncTask.execute(new Runnable() {
  task1.executeOnExecutor(directExecutor, params1);
  task2.executeOnExecutor(directExecutor, params2);
});

我现在的电脑上没有安装Android SDK,所以无法进行验证。


-1
你可以做以下事情:
YourAsyncClass1 thread1 = new YourAsyncClass1();
thread1.execute(inputArgument1);

    try {
        outputResult1 = thread1.get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
if(outputResult1 == true /*Or expected result*/){
  YourAsyncClass2 thread2 = new YourAsyncClass2();
  thread2.execute(inputArgument2);
}

谢谢回复。但是如果任务1需要10分钟才能完成,那么try catch只会在10分钟之前执行一次,因此错过了任务1实际完成的时机,对吗? - Yash
嗨,问题是,你使用thread1.get()调用此函数,该部分负责等待。try{} catch{}块确实只会执行一次,但等待(整个10分钟)在第一次通过块和我提到的部分时执行。 - g00dy
我会尽快尝试这种方法。但是,当我查看此解决方案时,如果在UI线程上运行thread1.get(),它会冻结整个10分钟的UI线程,对吧?因此,我想我应该在另一个Async任务中调用.get()。如果我理解有误,请您纠正我。 - Yash
如果你在主线程(activity)上执行.get(),它将冻结它 - 是的。我原以为这是主要目标,但显然不是,所以请澄清每个AsyncTasks的生命周期。我的意思是描述一个测试场景,以便我们可以看到何时执行任务1,何时何地期望其结果(同样适用于任务2)。不必调用.get(),但你也可以在onPostExecute()上设置标志来查看任务是否已完成,如果不想等待它完成。 - g00dy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接