Rumah >Java >javaTutorial >Bagaimanakah Saya Boleh Menggantikan AsyncTask dengan java.util.concurrent dengan Berkesan dalam Android sambil Mengekalkan Keserasian Ke Belakang?

Bagaimanakah Saya Boleh Menggantikan AsyncTask dengan java.util.concurrent dengan Berkesan dalam Android sambil Mengekalkan Keserasian Ke Belakang?

DDD
DDDasal
2025-01-05 08:06:40996semak imbas

How Can I Effectively Replace AsyncTask with java.util.concurrent in Android while Maintaining Backward Compatibility?

Pemberhentian API AsyncTask dalam Android 11: Alternatif dengan Java Concurrency

Memandangkan Android 11 menghampiri, Google sedang menghentikan API AsyncTask secara berperingkat, menasihati pembangun untuk mengguna pakai java.util.concurrent untuk operasi tak segerak. Anjakan ini menimbulkan persoalan: bagaimana anda boleh menggantikan AsyncTask secara berkesan dengan java.util.concurrent sambil mengekalkan keserasian dengan tahap API 16 dan ke atas?

Pertimbangkan coretan berikut daripada kelas dalaman statik Aktiviti:

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

Satu penyelesaian yang berdaya maju ialah memanfaatkan Pelaksana daripada pakej java.util.concurrent. Berikut ialah pelaksanaan Java berdasarkan pendekatan Kotlin yang ditemui dalam Android Async API is Deprecated post:

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

Untuk pengguna Java 8, versi yang lebih ringkas tersedia:

ExecutorService executor = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());

executor.execute(() -> {
    // Background work here
    handler.post(() -> {
        // UI Thread work here
    });
});

Sementara Java mungkin tidak sepadan dengan ringkas Kotlin, alternatif ini menyediakan penyelesaian yang berdaya maju untuk operasi tak segerak dalam era pasca-AsyncTask, memastikan keserasian dengan peranti tahap API 16.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggantikan AsyncTask dengan java.util.concurrent dengan Berkesan dalam Android sambil Mengekalkan Keserasian Ke Belakang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn