EDYCJA : To pytanie nie jest duplikatem jak
- Zaledwie kilka dni temu dokonano zatwierdzenia AOSP dotyczącego wycofania.
- Drugie pytanie dotyczy używania AsyncTaskLoader zamiast AsyncTask.
Google wycofuje interfejs API Android AsyncTask w systemie Android 11 i sugeruje jego użycie java.util.concurrent
. możesz sprawdzić zatwierdzenie tutaj
*
* @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> {
Jeśli utrzymujesz starszą bazę kodu z asynchronicznymi zadaniami w Androidzie, prawdopodobnie będziesz musiał ją zmienić w przyszłości. Moje pytanie brzmi: jaka powinna być właściwa zamiana fragmentu kodu pokazanego poniżej przy użyciu java.util.concurrent
. Jest to statyczna wewnętrzna klasa działania. Szukam czegoś, co będzie działać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) ;
}
}
AsyncTask
nie można go usunąć bez naruszenia kompatybilności wstecznej.Odpowiedzi:
Dobra przeszkoda, że jest przestarzała, ponieważ
WeakReference<Context>
zawsze był to hack, a nie właściwe rozwiązanie .Teraz ludzie będą mieli możliwość oczyszczenia swojego kodu.
Oparty na tym kodzie,
Progress
tak naprawdę nie jest potrzebny, i jestString
wejście +MyPojo
wyjście.Jest to w rzeczywistości dość łatwe do osiągnięcia bez użycia AsyncTask.
Jak przekazać ciąg? Tak jak:
I
W tym przykładzie użyto puli jednowątkowej, która jest dobra dla zapisów DB (lub serializowanych żądań sieciowych), ale jeśli chcesz czegoś do odczytu DB lub wielu żądań, możesz rozważyć następującą konfigurację modułu wykonującego:
źródło
executor.post
. Nie można rozwiązać metodyexecute()
zamiastpost()
Context
? Wiem, że przejścieContext
doAsyncTask
jednego z nich było jednym z problemów.newSingleThreadExecutor
jest lepszy dla zapisów, ale zdecydowanie powinieneś użyćTHREAD_POOL_EXECUTOR
na końcu postu do odczytu bazy danych.Google zaleca korzystanie z platformy Java Concurrency lub Kotlin Coroutines. ale Rxjava ma znacznie większą elastyczność i funkcje niż współbieżność Java, dzięki czemu zyskała sporą popularność.
źródło