EDIT : Diese Frage ist kein Duplikat als
- Vor ein paar Tagen wurde ein AOSP-Commit für die Abschreibung durchgeführt.
- Die andere Frage betrifft die Verwendung von AsyncTaskLoader über AsyncTask.
Google lehnt die Android AsyncTask-API in Android 11 ab und schlägt vor, sie java.util.concurrent
stattdessen zu verwenden . Sie können das Commit hier überprüfen
*
* @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 mit asynchronen Aufgaben in Android verwalten, müssen Sie diese wahrscheinlich in Zukunft ändern. Meine Frage ist, was der richtige Ersatz für das unten gezeigte Code-Snippet sein soll java.util.concurrent
. Es ist eine statische innere Klasse einer Aktivität. Ich suche etwas, mit dem ich arbeiten kannminSdkVersion 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) ;
}
}
AsyncTask
kann nicht entfernt werden, ohne die Abwärtskompatibilität zu beeinträchtigen.Antworten:
Gute Befreiung, dass es veraltet ist, denn das
WeakReference<Context>
war immer ein Hack und keine richtige Lösung .Jetzt haben die Leute die Möglichkeit, ihren Code zu bereinigen.
Basierend auf diesem Code
Progress
wird eigentlich nicht benötigt, und es gibt eineString
Eingabe +MyPojo
Ausgabe.Dies ist ohne Verwendung von AsyncTask recht einfach zu erreichen.
Wie übergebe ich den String? Wie so:
Und
In diesem Beispiel wurde ein Single-Threaded-Pool verwendet, der für DB-Schreibvorgänge (oder serialisierte Netzwerkanforderungen) geeignet ist. Wenn Sie jedoch etwas für DB-Lesevorgänge oder mehrere Anforderungen wünschen, können Sie die folgende Executor-Konfiguration in Betracht ziehen:
quelle
executor.post
. Methode kann nicht aufgelöst werdenexecute()
stattpost()
Context
in dieses zu übergeben? Ich weiß, dass das Übergeben einesContext
inAsyncTask
eines seiner Probleme war.newSingleThreadExecutor
ist besser für Schreibvorgänge, aber Sie sollten auf jeden Fall dasTHREAD_POOL_EXECUTOR
am Ende des Beitrags für Datenbanklesevorgänge verwenden.Google empfiehlt die Verwendung des Concurrency-Frameworks von Java oder von Kotlin Coroutines. Aber Rxjava hat am Ende viel mehr Flexibilität und Funktionen als Java-Parallelität und hat so einiges an Popularität gewonnen.
quelle