首頁 >Java >java教程 >Android 11 中 AsyncTask 的合適替代品是什麼?

Android 11 中 AsyncTask 的合適替代品是什麼?

DDD
DDD原創
2024-12-15 07:18:14219瀏覽

What are the suitable replacements for AsyncTask in Android 11 and how can I migrate my existing AsyncTask code to use them, targeting minSdkVersion 16?

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=&quot;https://developer.android.com/topic/libraries/architecture/coroutines&quot;>
 *   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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn