在Android 11中,AsyncTask API已被弃用。有哪些替代方案? | 您所在的位置:网站首页 › bundle是什么类型 › 在Android 11中,AsyncTask API已被弃用。有哪些替代方案? |
private WeakReference activityReference;
好在它被废弃了。因为WeakReference总是一个黑客,而不是一个适当的解决方案。. 现在人们将有机会对他们的代码进行消毒。 AsyncTask基于这个代码,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 { void onComplete(R result); } public void executeAsync(Callable callable, Callback callback) { executor.execute(() -> { final R result = callable.call(); handler.post(() -> { callback.onComplete(result); }); }); } }如何传入字符串?像这样。 class LongRunningTask implements Callable { 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()); |
CopyRight 2018-2019 实验室设备网 版权所有 |