android - 异步任务的最佳替代品
问题描述
我正在使用 AsyncTask 并且我有 Android 11 测试调试设备。现在它说 AsyncTask 在 API 30+ 上贬值了。那么,有什么替代品吗?我在这里有替代方案,但我不太确定这是否适用于所有 API 级别,如 android 11 到 Android 12 和未来的 Android 版本。
这是代码
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public abstract class AdvancedAsyncTask<INPUT, PROGRESS, OUTPUT> {
private boolean cancelled = false;
private Future<OUTPUT> outputFuture;
public AdvancedAsyncTask() {
}
/**
* @see #execute(Object)
*/
public AdvancedAsyncTask<INPUT, PROGRESS, OUTPUT> execute() {
return execute(null);
}
/**
* Starts is all
* @param input Data you want to work with in the background
*/
public AdvancedAsyncTask<INPUT, PROGRESS, OUTPUT> execute(final INPUT input) {
onPreExecute();
ExecutorService executorService = AsyncWorker.getInstance().getExecutorService();
outputFuture = executorService.submit(() -> {
try {
final OUTPUT output = doInBackground(input);
AsyncWorker.getInstance().getHandler().post(() -> onPostExecute(output));
return output;
} catch (Exception e) {
AsyncWorker.getInstance().getHandler().post(() -> onBackgroundError(e));
throw e;
}
});
return this;
}
public OUTPUT get() throws Exception {
if (outputFuture == null) {
throw new TaskNotExecutedException();
} else {
return outputFuture.get();
}
}
public OUTPUT get(long timeout, TimeUnit timeUnit) throws Exception {
if (outputFuture == null) {
throw new TaskNotExecutedException();
} else {
return outputFuture.get(timeout, timeUnit);
}
}
/**
* Call to publish progress from background
* @param progress Progress made
*/
protected void publishProgress(final PROGRESS progress) {
AsyncWorker.getInstance().getHandler().post(() -> {
onProgress(progress);
if (onProgressListener != null) {
onProgressListener.onProgress(progress);
}
});
}
protected void onProgress(final PROGRESS progress) {
}
/**
* Call to cancel background work
*/
public void cancel() {
cancelled = true;
}
/**
*
* @return Returns true if the background work should be cancelled
*/
protected boolean isCancelled() {
return cancelled;
}
/**
* Call this method after cancelling background work
*/
protected void onCancelled() {
AsyncWorker.getInstance().getHandler().post(() -> {
if (onCancelledListener != null) {
onCancelledListener.onCancelled();
}
});
}
/**
* Work which you want to be done on UI thread before {@link #doInBackground(Object)}
*/
protected void onPreExecute() {
}
/**
* Work on background
* @param input Input data
* @return Output data
* @throws Exception Any uncought exception which occurred while working in background. If
* any occurs, {@link #onBackgroundError(Exception)} will be executed (on the UI thread)
*/
protected abstract OUTPUT doInBackground(INPUT input) throws Exception;
/**
* Work which you want to be done on UI thread after {@link #doInBackground(Object)}
* @param output Output data from {@link #doInBackground(Object)}
*/
protected void onPostExecute(OUTPUT output) {
}
/**
* Triggered on UI thread if any uncought exception occurred while working in background
* @param e Exception
* @see #doInBackground(Object)
*/
protected abstract void onBackgroundError(Exception e);
private OnProgressListener<PROGRESS> onProgressListener;
public interface OnProgressListener<PROGRESS> {
void onProgress(PROGRESS progress);
}
public void setOnProgressListener(OnProgressListener<PROGRESS> onProgressListener) {
this.onProgressListener = onProgressListener;
}
private OnCancelledListener onCancelledListener;
public interface OnCancelledListener {
void onCancelled();
}
public void setOnCancelledListener(OnCancelledListener onCancelledListener) {
this.onCancelledListener = onCancelledListener;
}
}
这 java.util.concurrent 是否适用于未来的 android 版本?谢谢你的任何答案
解决方案
我们有 java.util.concurrent.Executors 类,如果你不想使用 Kotlin 协程,我们可以使用它来代替 AsyncTask。
推荐阅读
- twitter-bootstrap - 如何在 BOOTSTRAP 5 上推拉列?
- python - __getitem__ 中使用的 Python 参数?
- sql - BigQuery SQL 用户代理检测
- android - 自动竞争在 Android Studio 中不起作用
- python - 日期不等于今天
- python - 将类对象转换为 Json(带有日期时间字段)-TypeError:日期时间类型的对象不是 JSON 可序列化的
- javascript - 将 Javascript 中的 React.js 元素数组存储到某个文件或任何存储中,以便以后使用
- flutter - 从 Future 函数返回字符串
- selenium - http登录请求 - selenium webdriver
- mysql - 选择属性 A = 1 的 LATEST 行之后的所有行