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被解析之前无法执行 异步完成
我可以使用什么方法来转换上面的代码,这些代码接收多个参数并直接输出到如上所示的变量 这里有一些方法可以做到这一点:
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”。