前言
本文介绍如何使用 subscribeOn/observeOn
来实现后台执行耗时任务,并通知主线程更新进度。
当我们需要进行一些耗时操作,例如下载、访问数据库等,为了不阻塞主线程,往往会将其放在后台进行处理,同时在处理的过程中、处理完成后通知主线程更新 UI,这里就涉及到了后台线程和主线程之间的切换。首先回忆一下,在以前我们一般会用以下两种方式来实现这一效果:
- 创建一个新的子线程,在其
run()
方法中执行耗时的操作,并通过一个和主线程 Looper 关联的 Handler 发送消息给主线程更新进度显示、处理结果。 - 使用
AsyncTask
,在其doInBackground
方法中执行耗时的操作,调用 publishProgress 方法通知主线程,然后在onProgressUpdate
中更新进度显示,在 onPostExecute 中显示最终结果。
//Butter Knife
implementation 'com.jakewharton:butterknife:10.2.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'
//TitleBar
implementation 'com.github.getActivity:TitleBar:8.6'
//RxJava
implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
2. 布局文件
3. 逻辑代码
public class MainActivity extends BaseActivity {
private static final String TAG = "MainActivity";
@BindView(R.id.btn_download)
Button mTvDownload;
@BindView(R.id.tv_download_result)
TextView mTvResult;
private CompositeDisposable mCompositeDisposable = new CompositeDisposable();
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
@Override
protected void initView() {
}
@OnClick(R.id.btn_download)
public void onViewClicked() {
startDownload();
}
private void startDownload() {
final Observable observable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?