在android中链接2个异步任务的正确方法

Posted

技术标签:

【中文标题】在android中链接2个异步任务的正确方法【英文标题】:Proper way to chain 2 async tasks in android 【发布时间】:2013-07-25 02:36:07 【问题描述】:

我有两个异步任务,分别是任务 1 和任务 2。

我需要先运行任务 1,然后再运行任务 2,但我不想通过在任务 1 的 onPostExecute 实现中调用任务 2 来耦合两者;因为我在其他情况下单独使用任务 1。

我有没有办法定义两个异步任务而不会相互绑定并在特定情况下将它们链接起来?

非常感谢您的帮助。

【问题讨论】:

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

你可以试试这样的:

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,所以无法验证。

【讨论】:

【参考方案2】:

您可以执行以下操作:

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 实际完成时会丢失? 你好,问题是,你打电话给thread1.get(),那部分负责等待。 try catch 块确实只会执行一次,但是等待(整个 10 分钟)在第一次通过块时执行,并且在我提到的部分中。 我会尽快尝试这种方法。但是在查看此解决方案时,如果我在 UI 线程上运行 thread1.get(),它将冻结整个 10 分钟的 UI 线程,对吗?因此我想我应该在另一个异步任务中调用 .get() 。如果我错了,请纠正我。 如果您在主线程(活动)上执行.get(),它将冻结它 - 是的。我以为这是主要目标,但显然不是,所以请澄清两个AsyncTasks 中的每一个的生命周期。我的意思是描述一个测试场景,以便我们可以看到 task1 何时执行,您期望它的结果何时何地(与 task2 相同)。调用.get() 不是必须的,但您也可以在onPostExecute() 上设置一个标志,以查看如果您不想等待任务是否已完成。

以上是关于在android中链接2个异步任务的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

Android AsyncTask异步任务的使用

Android异步任务异常

异步Android SQLite数据库的正确实现

Android - 执行异步任务的最佳方式

浅谈JS异步(asychrouous)

在 useEffect 挂钩中取消所有异步/等待任务以防止反应中的内存泄漏的正确方法是啥?