According to the Android documentation AsyncTask was deprecated in API level 30 and it is suggested to use the standard java.util.concurrent or Kotlin concurrency utilities instead.
public abstract class AsyncTasks<Params, Result> {
private final ExecutorService executors;
public AsyncTasks() {
this.executors = Executors.newSingleThreadExecutor();
}
@SafeVarargs
private final void startBackground(Params... params) {
onPreExecute();
executors.execute(() -> {
Result result = doInBackground(params);
new Handler(Looper.getMainLooper()).post(() -> onPostExecute(result));
});
}
@SafeVarargs
public final void execute(Params... params) {
startBackground(params);
}
public void shutdown() {
executors.shutdown();
}
public boolean isShutdown() {
return executors.isShutdown();
}
@SuppressWarnings("unchecked")
protected abstract Result doInBackground(Params... params);
protected void onPreExecute() {}
protected void onPostExecute(Result result) {}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
// Simply call to execute task
new MyTask().execute();
}
/**
* Sub-class of AsyncTask
*/
private class MyTask extends AsyncTasks<Void, String> {
@Override
protected void onPreExecute() {
// Before execution
}
@Override
protected String doInBackground(Void... args) {
// Background task here
return "TASK_COMPLETE";
}
@Override
protected void onPostExecute(String result) {
// UI task here
}
}
}