Google 在 Android 11 中弃用了 Android AsyncTask API,并建议java.util.concurrent改用。你可以在这里查看提交
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
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) ; } }
private WeakReference<MyActivity> activityReference;
很好摆脱它已被弃用,因为它WeakReference<Context>总是一个黑客,而不是一个适当的解决方案。
WeakReference<Context>
现在人们将有机会清理他们的代码。
AsyncTask<String, Void, MyPojo>
基于这段代码,Progress其实是不需要的,而且有String输入+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>());