RxJava配合Retrofit:
Retrofit请求服务器(通过okhttp)拿到响应码给RxJava,RxJava处理回来的数据,Retrofit是典型的封装框架
Retrofit是一个封装框架,Retrofit不是网络请求框架
public class HttpUtil {
private static final String TAG = "HttpUtils";
public static String BASE_URL = "https://www.wanandroid.com/";
public static void setBaseUrl(String baseUrl) {
BASE_URL = baseUrl;
}
/**
* 根据各种配置创建出Retrofit
*
* @return 返回创建好的Retrofit
*/
public static Retrofit getOnlineCookieRetrofit() {
// 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();
//完全等价图中的 Retrofit(封装框架)
return new Retrofit.Builder().baseUrl(BASE_URL)
// TODO 请求用 OKhttp
.client(okHttpClient)
// TODO 响应RxJava
// 添加一个json解析的工具
.addConverterFactory(GsonConverterFactory.create(new Gson()))
// 添加rxjava处理工具
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
}
public class UseActivity extends AppCompatActivity {
private final static String TAG = UseActivity.class.getSimpleName();
private WanAndroidApi api;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_use);
api = HttpUtil.getOnlineCookieRetrofit().create(WanAndroidApi.class);
}
/**
* TODO Retrofit+RxJava 查询 项目分类 (总数据查询)
*
* @param view
*/
public void getProjectAction(View view) {
// 获取网络API
api.getProject()//起点 返回的Observable
.subscribeOn(Schedulers.io()) // 上面 异步线程
.observeOn(AndroidSchedulers.mainThread()) // 下面 主线程
.subscribe(new Consumer<ProjectBean>() { //new Observable 的简略写法
@Override
public void accept(ProjectBean projectBean) throws Exception {
Log.d(TAG, "accept: " + projectBean); // UI 可以做事情
}
});
}
/**
* TODO Retrofit+RxJava 查询 获取项目列表数据 (Item)
*
* @param view
*/
public void getProjectListAction(View view) {
// id 写死的
api.getProjectItem(1, 294) //起点 返回的Observable
// .....
.subscribeOn(Schedulers.io()) // 上面 异步
.observeOn(AndroidSchedulers.mainThread()) // 下面 主线程
.subscribe(data->{
Log.d(TAG, "getProjectListAction: " + data);
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".retrofit.UseActivity"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="项目分类"
android:onClick="getProjectAction"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="项目列表数据"
android:onClick="getProjectListAction"
/>
</LinearLayout>
逻辑图:
防抖
自动化脚本一秒点button百次只响应一次(不抖动)
RxBinding 防抖
public class UseActivity extends AppCompatActivity {
private final static String TAG = UseActivity.class.getSimpleName();
private WanAndroidApi api;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_use);
api = HttpUtil.getOnlineCookieRetrofit().create(WanAndroidApi.class);
// 功能防抖 + 网络嵌套
antiShakeActonUpdate();
}
/**
* TODO Retrofit+RxJava 查询 项目分类 (总数据查询)
*
* @param view
*/
public void getProjectAction(View view) {
// 获取网络API
api.getProject()//起点 返回的Observable
.subscribeOn(Schedulers.io()) // 上面 异步线程
.observeOn(AndroidSchedulers.mainThread()) // 下面 主线程
.subscribe(new Consumer<ProjectBean>() { //new Observable 的简略写法
@Override
public void accept(ProjectBean projectBean) throws Exception {
Log.d(TAG, "accept: " + projectBean); // UI 可以做事情
}
});
}
/**
* TODO Retrofit+RxJava 查询 获取项目列表数据 (Item)
*
* @param view
*/
public void getProjectListAction(View view) {
// id 写死的
api.getProjectItem(1, 294) //起点 返回的Observable
// .....
.subscribeOn(Schedulers.io()) // 上面 异步
.observeOn(AndroidSchedulers.mainThread()) // 下面 主线程
.subscribe(data->{
Log.d(TAG, "getProjectListAction: " + data);
});
}
/**
* RxBinding 防抖
* TODO 功能防抖 + 网络嵌套(负面教程)
*/
@SuppressLint("CheckResult")
private void antiShakeActon() {
// 注意:(项目分类)查询的id,通过此id再去查询(项目列表数据)
// 对那个控件防抖动?
Button bt_anti_shake = findViewById(R.id.bt_anti_shake);
RxView.clicks(bt_anti_shake)
.throttleFirst(2000, TimeUnit.MILLISECONDS) // 2秒钟之内 响应你一次
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
api.getProject() // 查询主数据
.compose(DownloadActivity.rxud())
.subscribe(new Consumer<ProjectBean>() {
@Override
public void accept(ProjectBean projectBean) throws Exception {
for (ProjectBean.Data dataBean : projectBean.getData()) { // 10
// 查询item数据
api.getProjectItem(1, dataBean.getId())
.compose(DownloadActivity.rxud())
.subscribe(new Consumer<ProjectItem>() {
@Override
public void accept(ProjectItem projectItem) throws Exception {
Log.d(TAG, "accept: " + projectItem); // 可以UI操作
}
});
}
}
});
}
});
}
/**
* 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<Object, ObservableSource<ProjectBean>>() {
@Override
public ObservableSource<ProjectBean> apply(Object o) throws Exception {
return api.getProject(); // 主数据
}
})
//发射多次
.flatMap(new Function<ProjectBean, ObservableSource<ProjectBean.Data>>() {
@Override
public ObservableSource<ProjectBean.Data> apply(ProjectBean projectBean) throws Exception {
return Observable.fromIterable(projectBean.getData()); // 我自己搞一个发射器 发多次
}
})
.flatMap(new Function<ProjectBean.Data, ObservableSource<ProjectItem>>() {
@Override
public ObservableSource<ProjectItem> apply(ProjectBean.Data dataBean) throws Exception {
return api.getProjectItem(1, dataBean.getId());
}
})
.observeOn(AndroidSchedulers.mainThread()) // 给下面切换 主线程
.subscribe(new Consumer<ProjectItem>() {
@Override
public void accept(ProjectItem projectItem) throws Exception {
// 如果我要更新UI
Log.d(TAG, "accept: " + projectItem);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".retrofit.UseActivity"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="项目分类"
android:onClick="getProjectAction"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="项目列表数据"
android:onClick="getProjectListAction"
/>
<Button
android:id="@+id/bt_anti_shake"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="功能防抖"
/>
</LinearLayout>