学而实习之 不亦乐乎

Android 中 AsyncTask 弃用后的替代方法

2024-04-23 20:14:09

AsyncTask 在 Android 中被用于在后台线程中执行耗时任务,并在主线程中更新 UI。然而,自从 Android 11 (API 级别 30) 开始,AsyncTask 被弃用。这是因为 AsyncTask 在并发执行多个后台任务时存在问题,容易导致内存泄漏和其他并发问题。

为了替代 AsyncTask,Android 推荐使用 Executor, ThreadPoolExecutor 或者 Future 结合 Handler 来实现异步任务的执行。

以下是使用 Executor 和 Future 替代 AsyncTask 的一个简单例子:

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import androidx.appcompat.app.AppCompatActivity;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class MainActivity extends AppCompatActivity {

    private Executor executor = Executors.newSingleThreadExecutor();
    private Handler mainHandler = new Handler(Looper.getMainLooper());

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Future<String> future = executor.submit(new BackgroundTask());
        future.get(); // 这里可以使用 future 来获取异步任务的结果
    }

    private class BackgroundTask implements Runnable {
        @Override
        public void run() {
            // 在这里执行耗时任务
            String result = "任务执行结果";

            // 使用 Handler 将结果传递到主线程
            mainHandler.post(new UpdateUI(result));
        }
    }

    private class UpdateUI implements Runnable {
        private String result;

        UpdateUI(String result) {
            this.result = result;
        }

        @Override
        public void run() {
            // 更新 UI
        }
    }
}

在这个例子中,我们使用了 Executor 来执行后台任务,并通过 Future 获取任务的执行结果。Handler 和 Looper 被用于在主线程中更新 UI。这是一个更为稳定和推荐的异步任务处理方式。