RxJava 之所以在很多 Android 项目中“取代” AsyncTask,并不是因为 RxJava 能“替代所有线程切换”,而是因为它在异步编程模型、可维护性、组合能力和生命周期管理上明显优于 AsyncTask。下面从几个关键角度说明。
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... voids) {
return loadData();
}
@Override
protected void onPostExecute(String s) {
textView.setText(s); // Activity 可能已销毁
}
}.execute();
onPostExecute 直接操作 UI,容易崩溃cancel(true)),但很多人会忘记例如:
用 AsyncTask:
AsyncTask:
ExecutorsHandlerThreadCoroutine / RxJavaObservable.fromCallable(() -> loadData())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
data -> textView.setText(data),
Throwable::printStackTrace
);
doInBackground / onPostExecute)getUser()
.flatMap(user -> getOrders(user.id))
.subscribe(orders -> show(orders));
map / flatMap / zip / merge.subscribe(
data -> {},
e -> handleError(e)
);
onErrorReturnretrytimeoutobservable
.compose(bindUntilEvent(ActivityEvent.DESTROY))
.subscribe();
RxJava 不只是“线程工具”:
RxBinding)都用同一套模型:
一切皆流(Observable / Flowable)
AsyncTask 是“写起来简单,维护起来地狱”
RxJava 是“学习成本高,但复杂异步可控”
所以 RxJava 取代 AsyncTask,本质是:
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。