【问题标题】:How to operate a series of different functions one by one?一系列不同的功能如何一个一个地操作?
【发布时间】:2014-02-04 15:38:47
【问题描述】:

我知道在 .net 中,我可以在任务中做这样的事情,

task.ContinueWith((v) =>
        {
            Operation1();
        })

            .ContinueWith((V) =>
            {
                Operation2();
            },  

            Cancel.Token, TaskContinuationOptions.None, Scheduler);
        return task;

或者使用 Aysnc/Await 功能来一一进行操作。

如何在 Java 中做到这一点?

我看过AsyncTask的资料,但是doInBackground中的操作完成后,onPostExecute(Result)中的方法还是会被同步调用。

所以我的问题是如何一个一个地操作一系列不同的功能?

【问题讨论】:

  • 您能用英文描述一下您要查找的代码应该做什么吗?
  • 如果您正在寻找 lambda 函数,那么 java 还没有它。带有 lambda 的 Java 8 将于今年晚些时候发布。
  • 他想知道如何链接多个异步任务,以便它们串行执行(但仍然异步 w.r.t. 调用者和彼此)。他的 C# 示例使用 .NET 任务的 ContinueWith 方法来调用每个后续任务,作为前面任务完成(或失败)的延续。我使用自己的 .NET 的Task API 实现在 Java 中执行此操作,所以很遗憾我无法提供基于 Java 核心 API 的解决方案。

标签: java function series


【解决方案1】:

如果您对 Rx 感到满意,您可以使用 RxJava。它不漂亮,但它有效:

final ExecutorService executor = Executors.newCachedThreadPool();

final ConnectableObservable<?> result = Observable.concat(
    Observable.defer(
        new Func0<Observable<?>>() {
            @Override
            public Observable<?> call() {
                return Observable.from(
                    executor.submit(
                        new Runnable() {
                            @Override public void run() { task(1); }
                        }
                    )
                );
            }
        }
    ),
    Observable.defer(
        new Func0<Observable<?>>() {
            @Override
            public Observable<?> call() {
                return Observable.from(
                    executor.submit(
                        new Runnable() {
                            @Override public void run() { task(2); }
                        }
                    )
                );
            }
        }
    )
).replay();

result.connect();

可能有更好的方法来做到这一点,但我不太了解 RxJava API,因为我使用自己的 Rx for Java 实现。

要点是:

  1. concat() 运算符以串行方式连接多个可观察序列。在这种情况下,每个序列只是一个元素:任务的结果。
  2. defer() 运算符会阻止每个任务被安排,直到有人订阅。在这种情况下,当前面的任务/序列终止时会发生这种情况。
  3. from() 运算符将Future&lt;?&gt; 转换为Observable&lt;?&gt;
  4. replay() 操作符创建一个可连接的 observable,确保任务序列只执行一次,即使有多个订阅者。结果将被捕获,因此迟到的订阅者仍会收到它。
  5. 调用connect() 启动任务序列。

【讨论】:

    【解决方案2】:

    您可以覆盖 onPostExecute(result),这与 C# 相比似乎很尴尬。您可能会选择成为 Java 8 的早期适配器和 lambda,因此您可以实现相同的语法:

    .ContinueWith(v -> operation1())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      • 2016-07-04
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      相关资源
      最近更新 更多