Java 具有多个参数的异步函数

Java 具有多个参数的异步函数,java,android,asynchronous,android-asynctask,executorservice,Java,Android,Asynchronous,Android Asynctask,Executorservice,我目前有以下编码: outputData = parseData(in_data, category, lastKey, firstKey); return outputData.indexOf("true"); parseData将返回ArrayList。outputData是ArrayList 我想将上面的代码转换为异步运行,因为parseData需要花费大量时间来处理 我的主要问题是: 我需要一个异步处理的解决方案,它需要多个 变量和输出数组列表 第二行代码在parseData被解析之

我目前有以下编码:

outputData = parseData(in_data, category, lastKey, firstKey);
return outputData.indexOf("true");
parseData将返回ArrayList。outputData是ArrayList

我想将上面的代码转换为异步运行,因为parseData需要花费大量时间来处理

我的主要问题是:

  • 我需要一个异步处理的解决方案,它需要多个 变量和输出数组列表
  • 第二行代码在parseData被解析之前无法执行 异步完成

我可以使用什么方法来转换上面的代码,这些代码接收多个参数并直接输出到如上所示的变量

这里有一些方法可以做到这一点:

  • :您可以在对象中创建参数,然后使用它
  • 手摇线
  • 作业调度器 这是一个API,用于根据将在应用程序自己的进程中执行的框架调度各种类型的作业

  • 有关详细信息,请参见此

  • ExecutorService
    Handler
    来实现该功能
  • 您也可以使用该解决方案来实现该功能。您可以阅读本文来学习它

  • 如果任务不需要太多时间,可以使用
    AsyncTask
    ,因为它很容易使用,因此您希望代码异步运行,并在完成所有计算后的一段时间将结果写入变量
    outputData
    。 首先,如果
    outputData
    是一个局部变量,这是不可能的。 其次,如果
    outputData
    是一个字段,这是可能的,但并不方便:当您最终想要使用该值时,您如何知道异步计算已经完成?因此,为了应对这种情况,设计了接口
    java.util.concurrent.Future

    调用此类独立异步代码的常用方法是使用
    ExecutorService.submit(Callable)
    ,它返回
    Future
    。当您需要计算结果时,可以调用
    Future.get()
    并等待计算结果:

    ExecutorService pool = ForkJoinPool.commonPool(); // or use any other ExecutorService 
    Callable<ArrayList> function = ()->parseData(in_data, category, lastKey, firstKey);
    Future<ArrayList> future = pool.submit(function); // computation started in parallel, we can do other work
    ...
    ArrayList res = future.get(); // when we eventually need the result of asynchronous computation
    
    执行器服务池=ForkJoinPool.commonPool();//或使用任何其他服务 可调用函数=()->parseData(in_data,category,lastKey,firstKey); Future=pool.submit(函数);//计算是并行开始的,我们可以做其他的工作 ... ArrayList res=future.get();//当我们最终需要异步计算的结果时
    AsyncTask
    很快就会被弃用,这不是最好的选择。@art作为AsyncTask的替代方案,什么是最好的解决方案?@Calvin您还没有描述您的具体情况以给出合理的答案,但根据我们的情况,我认为
    RxJava
    @art,我已经编辑了我的问题,不确定这个编辑是否足够清晰。@Calvin现在在哪里调用
    parseData
    方法?活动或片段中的某个位置,或者ViewModel或Presenter中的某个位置?或者可能是一些背景任务。有一些方法可以帮助您选择合适的解决方案。如果这对您来说还不够,那么最好在这里显示更多的代码,到github repo的链接是最好的方式。我尝试了您的代码,Android Studio正在标记以下错误:“未处理的异常:java.util.concurrent.ExecutionException,java.lang.InterruptedException”,在“future.get();”上,get()用try catch环绕它,或者将封闭方法标记为“抛出ExecutionException,InterruptedException”。