前言
本文介绍如何使用 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
关注
打赏