Android 11 中棄用AsyncTask API:Java 並發的替代方案
隨著Android 11 的臨近,Google 正在逐步淘汰AsyncTask API ,並建議開發者採用java.util.concurrent 進行非同步操作。這種轉變提出了一個問題:如何用 java.util.concurrent 有效取代 AsyncTask,同時保持與 API 等級 16 及更高等級的兼容性?
考慮 Activity 靜態內部類別中的以下程式碼片段:
private static class LongRunningTask extends AsyncTask<String, Void, MyPojo> { private static final String TAG = MyActivity.LongRunningTask.class.getSimpleName(); private WeakReference<MyActivity> activityReference; LongRunningTask(MyActivity context) { activityReference = new WeakReference<>(context); } @Override protected MyPojo doInBackground(String... params) { // Some long running task } @Override protected void onPostExecute(MyPojo data) { MyActivity activity = activityReference.get(); activity.progressBar.setVisibility(View.GONE); populateData(activity, data); } }
一個可行的解決方案是利用 java.util.concurrent 套件中的 Executors。以下是Android Async API 已棄用貼文中基於Kotlin 方法的Java 實作:
ExecutorService executor = Executors.newSingleThreadExecutor(); Handler handler = new Handler(Looper.getMainLooper()); executor.execute(new Runnable() { @Override public void run() { // Background work here handler.post(new Runnable() { @Override public void run() { // UI Thread work here } }); } });
對於Java 8 用戶,可以使用更簡潔的版本:
ExecutorService executor = Executors.newSingleThreadExecutor(); Handler handler = new Handler(Looper.getMainLooper()); executor.execute(() -> { // Background work here handler.post(() -> { // UI Thread work here }); });
雖然Java 可能無法比擬Kotlin 的簡潔性,這些替代方案為後AsyncTask 時代的非同步操作提供了可行的解決方案,確保與API的兼容性16 級設備。
以上是如何在Android中有效地用java.util.concurrent取代AsyncTask,同時保持向後相容性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!