Heim >Java >javaLernprogramm >Was sind die geeigneten Ersetzungen für AsyncTask in Android 11 und wie kann ich meinen vorhandenen AsyncTask-Code migrieren, um sie zu verwenden und auf minSdkVersion 16 abzuzielen?
AsyncTask API in Android 11 veraltet: Welche Alternativen gibt es?
Google hat angekündigt, dass die Android AsyncTask API in Android 11 nicht mehr unterstützt wird, und empfiehlt stattdessen die Verwendung von java.util.concurrent. Sie können die Commit-Informationen hier einsehen:
* @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> {
Wenn Sie eine ältere Codebasis pflegen, die asynchrone Aufgaben in Android verwendet, ist es wahrscheinlich, dass Sie diese in Zukunft ändern müssen. Meine Frage ist, wie ich den unten gezeigten Codeausschnitt richtig durch java.util.concurrent ersetzen kann. Es handelt sich um eine statische innere Aktivitätsklasse. Ich suche nach einer Lösung, die in minSdkVersion 16 funktioniert.
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) ; } }
Alternative:
Sie können Executoren direkt aus dem java.util.concurrent-Paket verwenden.
Ich habe auch online nach Informationen gesucht und im folgenden Artikel eine Lösung gefunden: Android Async API ist veraltet.
Leider ist der Artikel in Kotlin geschrieben, aber nach einiger Mühe habe ich ihn in Java konvertiert. Nachfolgend finden Sie die Lösung.
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 } }); } });
Ist es nicht ganz einfach? Wenn Sie in Ihrem Projekt Java 8 verwenden, können Sie es noch weiter vereinfachen.
ExecutorService executor = Executors.newSingleThreadExecutor(); Handler handler = new Handler(Looper.getMainLooper()); executor.execute(() -> { //Background work here handler.post(() -> { //UI Thread work here }); });
Trotzdem ist es Kotlin in Bezug auf den prägnanten Code nicht überlegen, aber es ist besser als frühere Java-Versionen.
Ich hoffe, das hilft. Danke!
Das obige ist der detaillierte Inhalt vonWas sind die geeigneten Ersetzungen für AsyncTask in Android 11 und wie kann ich meinen vorhandenen AsyncTask-Code migrieren, um sie zu verwenden und auf minSdkVersion 16 abzuzielen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!