如何使用背景/异步任务制作线性/更具可读性的 Java 代码

Posted

技术标签:

【中文标题】如何使用背景/异步任务制作线性/更具可读性的 Java 代码【英文标题】:How to make linear/more readable Java code with background/asynctask 【发布时间】:2020-11-18 15:03:07 【问题描述】:

目前我有类似的东西;

public class SomeActivity 
 void onCreate() 
  doSomething();
  if (weNeedToDoSomeAsncTask()) 
   new SomeAsyncTask(afterSomeAsyncTask).execute();
   else 
   new DifferentAsyncTask(afterAnotherAsyncTask).execute();
  
 

 PostExecute afterSomeAsyncTask = new PostExecute() 
  void Callback(String response) 
   doSomethingElse(response);
   new DifferentAsyncTask(afterAnotherAsyncTask).execute();
  
 

从表面上看这并不算太糟糕,但我已经大大简化了代码,你可以想象当你有多个调用并开始发生一些分支时它会变得多么复杂。

为了帮助理解上下文,实际用例通常是这样的;

使用 sdk 获取一些设备/用户信息 使用返回的信息通过 Web 服务进行身份验证 向网络服务发送一些日志信息 从网络服务获取一些数据 从 Web 服务获取一些其他数据 使用该数据生成 UI

我希望我的代码看起来更像;

public class SomeActivity 
 void onCreate() 
  doSomething();
  if (weNeedToDoSomeAsncTask()) 
   new SomeAsyncTask().execute();
   doSomethingElse(response);
   
  new DifferentAsyncTask().execute();
  afterAnotherAsyncTask();
 

我过去曾尝试使用过.get(),但遇到了问题,但从未深入了解原因(可能我试图在另一个内部调用AsyncTask,我读过这是不行的-但它很久以前,所以不能确定)。虽然我意识到.get 在某种程度上击败了AsyncTask 的对象,但我只使用它是因为Java 强迫我这样做(用于网络通信等)。我的应用程序依赖于结果来继续,并且在它返回之前不能做任何其他事情。

我应该再次尝试.get() 技术吗?或者这是一个非常糟糕的主意?

我是否应该接受它并意识到代码更难阅读,我需要跳转到回调方法来尝试理解代码流?

或者有其他选择吗?

我也刚刚了解了 Needle,它看起来像一个不错的库 https://zsoltsafrany.github.io/needle/,我想我可以做得更多;

NetworkService networkService = new NetworkService();
Needle.onBackgroundThread().serially().execute(networkService);
String result = doSomethingWithResponse(networkService.response);
AnotherNetworkService anotherNetworkService = new AnotherNetworkService(result);
Needle.onBackgroundThread().serially().execute(anotherNetworkService);

但也许这与AsyncTask.get() 方法完全相同?

【问题讨论】:

【参考方案1】:

任何答案的 TL;DR 确实是:Kotlin 协程。

【讨论】:

【参考方案2】:

看看ScheduledThreadPoolExecutor,你可以像这样获得:

ExecutorService executor = Executors.newScheduledThreadPool(8);

安排期货的方法有很多种。

您的第一个示例可能如下所示:

public class SomeActivity 
 void onCreate() 
  doSomething();
  if (weNeedToDoSomeAsncTask()) 
   executor.submit(() -> /* async task */);
   doSomethingElse(response);
   
  executor.submit(() -> /* different async task */)
  afterAnotherAsyncTask();
 

(尽管您需要查看阻止/加入替代方案的具体方法。)

【讨论】:

以上是关于如何使用背景/异步任务制作线性/更具可读性的 Java 代码的主要内容,如果未能解决你的问题,请参考以下文章

让你的JS代码更具可读性

使用Pandas Autocorrelation Plot - 如何限制x轴以使其更具可读性?

在 python 中使用 pass 语句作为使代码更具可读性的一种方式?有关系吗?

Spring Boot - 异步任务

关于创建相互依赖的异步调用的建议

量角器 - 处理“then”承诺使它们更具可读性