学习笔记,自用,整理中
摘要:
重要是Rxjava思路:
响应式开发,一种管理思想,起点分发事件,一条线往下走,中间可以加多个节点处理,下一节点的输入是上一节点的输出,终点消费事件。
起点(分发事件:点击登录)--->登录api-->请求服务器--->获取响应码-->终点(更新ui成功,消费事件)。
术语:
Schedulers.io,如果是cpu大量计算则用scheduler.compxxx
RXbinding防抖功能
flatmap:解决嵌套,
doNext解决多api调用
用例1:
flatmap的使用 rxbingd的使用

public interface WangAndroidApi {
// 总数据
@GET("project/tree/json")
ObservablegetProject(); // 异步线程 耗时操作
// ITem数据
@GET("project/list/{pageIndex}/json")// ?cid=294
ObservablegetProjectItem(@Path("pageIndex")int pageIndex, @Query("cid")int cid); // 异步线程 耗时操作
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------
public class HttpUtil {
private static final StringTAG ="HttpUtils";
/**
* 默认 test-a环境
*/
public static StringBASE_URL ="https://www.wanandroid.com/";
public static void setBaseUrl(String baseUrl) {
BASE_URL = baseUrl;
}
/**
* 根据各种配置创建出Retrofit
* @return 返回创建好的Retrofit
*/
public static RetrofitgetOnlineCookieRetrofit() {
// OKHttp客户端
OkHttpClient.Builder httpBuilder =new OkHttpClient.Builder();
// 各种参数配置
OkHttpClient okHttpClient = httpBuilder
.addNetworkInterceptor(new StethoInterceptor())
.readTimeout(10000, TimeUnit.SECONDS)
.connectTimeout(10000, TimeUnit.SECONDS)
.writeTimeout(10000, TimeUnit.SECONDS)
.build();
return new Retrofit.Builder().baseUrl(BASE_URL)
// TODO 请求用OKhttp
.client(okHttpClient)
// TODO 响应RxJava
// 添加一个json解析的工具
.addConverterFactory(GsonConverterFactory.create(new Gson()))
// 添加rxjava处理工具
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
}
----------------------------------------------------------------------------------------------------------------------------------
/**
* TODO 功能防抖 + 网络嵌套 (解决嵌套的问题) flatMap
*/
@SuppressLint("CheckResult")
private void antiShakeActonUpdate() {
// 注意:项目分类查询的id,通过此id再去查询(项目列表数据)
// 对那个控件防抖动?
Button bt_anti_shake = findViewById(R.id.bt_anti_shake);
RxView.clicks(bt_anti_shake)
.throttleFirst(2000, TimeUnit.MILLISECONDS)// 2秒钟之内 响应你一次
// 我只给下面 切换 异步
.observeOn(Schedulers.io())
.flatMap(new Function>() {
@Override
public ObservableSourceapply(Object o)throws Exception {
return api.getProject(); // 主数据
}
})
.flatMap(new Function>() {
@Override
public ObservableSourceapply(ProjectBean projectBean)throws Exception {
return Observable.fromIterable(projectBean.getData()); // 我自己搞一个发射器 发多次10
}
})
.flatMap(new Function>() {
@Override
public ObservableSourceapply(ProjectBean.DataBean dataBean)throws Exception {
return api.getProjectItem(1, dataBean.getId());
}
})
.observeOn(AndroidSchedulers.mainThread())// 给下面切换 主线程
.subscribe(new Consumer() {
@Override
public void accept(ProjectItem projectItem)throws Exception {
// 如果我要更新UI 会报错2 不会报错1
Log.d(TAG, "accept: " + projectItem);
}
});
}
用例2
doNext的使用

/**
* TODO ================= 下面是一行代码完成整个需求
*/
private ProgressDialogprogressDialog;
Disposabledisposable;
public void request2(View view) {
/**
* 一行代码 实现需求
* 需求:
* 还有弹出加载
* * 1.请求服务器注册操作
* * 2.注册完成之后,更新注册UI
* * 3.马上去登录服务器操作
* * 4.登录完成之后,更新登录的UI
*/
MyRetrofit.createRetrofit().create(IReqeustNetwor.class)
.registerAction(new RegisterRequest())// todo 1.请求服务器注册操作// todo 2
.subscribeOn(Schedulers.io())// 给上面 异步
.observeOn(AndroidSchedulers.mainThread())// 给下面分配主线程
.doOnNext(new Consumer() {// todo 3
@Override
public void accept(RegisterResponse registerResponse)throws Exception {
// todo 2.注册完成之后,更新注册UI
}
})
// todo 3.马上去登录服务器操作
.observeOn(Schedulers.io())// 给下面分配了异步线程
.flatMap(new Function>() {// todo 4
@Override
public ObservableSourceapply(RegisterResponse registerResponse)throws Exception {
Observable loginResponseObservable = MyRetrofit.createRetrofit().create(IReqeustNetwor.class)
.loginAction(new LoginReqeust());
return loginResponseObservable;
}
})
.observeOn(AndroidSchedulers.mainThread())// 给下面 执行主线程
.subscribe(new Observer() {
// 一定是主线程,为什么,因为 subscribe 马上调用onSubscribe
@Override
public void onSubscribe(Disposable d) {
// TODO 1
progressDialog =new ProgressDialog(RequestActivity.this);
progressDialog.show();
// UI 操作
disposable = d;
}
@Override
public void onNext(LoginResponse loginResponse) {// todo 5
// TODO 4.登录完成之后,更新登录的UI
}
@Override
public void onError(Throwable e) {
}
// todo 6
@Override
public void onComplete() {
// 杀青了
if (progressDialog !=null) {
progressDialog.dismiss();
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// 必须这样写,最起码的标准
if (disposable !=null)
if (!disposable.isDisposed())
disposable.dispose();
}