Android 11 中棄用 AsyncTask API:替代方案是什麼?
Google已宣布將在 Android 11 中棄用 Android AsyncTask API,並建議改用 java.util.concurrent。您可以在此處查看提交資訊:
* @deprecated Use the standard <code>java.util.concurrent</code> or * <a href="https://developer.android.com/topic/libraries/architecture/coroutines"> * Kotlin concurrency utilities</a> instead. */ @Deprecated public abstract class AsyncTask<Params, Progress, Result> {
如果您正在維護一個在 Android 中使用非同步任務的較舊程式碼庫,那麼將來很可能需要對其進行更改。我的問題是,如何使用 java.util.concurrent 恰當地取代下方顯示的程式碼片段。它是 Activity 的靜態內部類別。我正在尋找可在 minSdkVersion 16 中使用的解決方案。
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 }); });
儘管如此,它在簡潔的程式碼方面仍無法勝過 kotlin,但比以前的 java 版本更好。
希望能有所幫助。感謝您!
以上是Android 11 中 AsyncTask 的合適替代品是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!