簡體   English   中英

如何使用背景/異步任務使線性/更具可讀性 Java 代碼

[英]How to make linear/more readable Java code with background/asynctask

目前我有類似的東西;

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 服務發送一些日志信息
  • 從 web 服務獲取一些數據
  • 從 web 服務獲取一些其他數據
  • 使用該數據生成 UI

我希望我的代碼看起來更像;

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

我過去曾嘗試過使用.get()並遇到問題,但從未深入了解原因(可能我試圖在另一個AsyncTask中調用一個,我讀過這是行不通的 - 但它已經很長時間了以前所以不能確定)。 雖然我意識到.get在某種程度上擊敗了AsyncTask的 object ,但我只使用它是因為 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()方法完全相同?

任何答案的 TL;DR 都將是:Kotlin 協程。

看看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();
 }
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM