如何解决AsyncTask API 在 Android 11 中已弃用有哪些替代方案?
private WeakReference<MyActivity> activityReference;
很好摆脱它已被弃用,因为它WeakReference<Context>
总是一个黑客,而不是一个适当的解决方案。
现在人们将有机会清理他们的代码。
AsyncTask<String, Void, MyPojo>
基于这段代码,Progress
其实是不需要的,而且有String
输入+MyPojo
输出。
这实际上很容易在不使用 AsyncTask 的情况下完成。
public class TaskRunner {
private final Executor executor = Executors.newSingleThreadExecutor(); // change according to your requirements
private final Handler handler = new Handler(Looper.getMainLooper());
public interface Callback<R> {
void onComplete(R result);
}
public <R> void executeAsync(Callable<R> callable, Callback<R> callback) {
executor.execute(() -> {
final R result = callable.call();
handler.post(() -> {
callback.onComplete(result);
});
});
}
}
如何传入字符串?像这样:
class LongRunningTask implements Callable<MyPojo> {
private final String input;
public LongRunningTask(String input) {
this.input = input;
}
@Override
public MyPojo call() {
// Some long running task
return myPojo;
}
}
和
// in viewmodel
taskRunner.executeAsync(new LongRunningTask(input), (data) -> {
// MyActivity activity = activityReference.get();
// activity.progressBar.setVisibility(View.GONE);
// populateData(activity, data) ;
loadingLiveData.setValue(false);
dataLiveData.setValue(data);
});
// in Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
viewmodel = viewmodelProviders.of(this).get(Myviewmodel.class);
viewmodel.loadingLiveData.observe(this, (loading) -> {
if(loading) {
progressBar.setVisibility(View.VISIBLE);
} else {
progressBar.setVisibility(View.GONE);
}
});
viewmodel.dataLiveData.observe(this, (data) -> {
populateData(data);
});
}
这个例子使用了一个单线程池,这对 DB 写入(或序列化的网络请求)很有用,但如果你想要一些用于 DB 读取或多个请求的东西,你可以考虑以下 Executor 配置:
private static final Executor THREAD_POOL_EXECUTOR =
new ThreadPoolExecutor(5, 128, 1,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
解决方法
Google 在 Android 11 中弃用了 Android AsyncTask
API,并建议java.util.concurrent
改用。你可以在这里查看提交
*
* @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> {
如果您在 Android
中使用异步任务维护较旧的代码库,那么您将来可能不得不对其进行更改。我的问题是应该正确替换下面显示的代码片段,使用java.util.concurrent
.
它是 Activity 的静态内部类。我正在寻找可以使用的东西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) ;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。