深入理解RxJava编程思想( 二 )

() {@Overridepublic Bitmap apply(Bitmap bitmap) throws Exception {Log.d(TAG, "apply: 这个时候下载了图片啊: " + System.currentTimeMillis());return bitmap;}}).subscribeOn(Schedulers.io())//给上面的代码分配异步线程.observeOn(AndroidSchedulers.mainThread())// 给下面的代码执行主线程//订阅起点和终点订阅起来.subscribe(//终点new Observer() {//订阅开始@Overridepublic void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {//预备 开始要分发//TODO 第一步progressDialog = new ProgressDialog(DownloadActivity.this);progressDialog.setTitle("download run");progressDialog.show();}//TODO 第四步//拿到事件@Overridepublic void onNext(@io.reactivex.annotations.NonNull Bitmap bitmap) {imageView.setImageBitmap(bitmap);}//错误事件@Overridepublic void onError(@io.reactivex.annotations.NonNull Throwable e) {}//TODO 第五步//完成事件@Overridepublic void onComplete() {if (progressDialog != null)progressDialog.dismiss();}});}//图片上绘制文字,添加水印private final Bitmap drawTextToBitmap(Bitmap bitmap, String text, Paint paint, int paddingLeft, int paddingTop) {Bitmap.Config bitmapConfig = bitmap.getConfig();paint.setDither(true); //获取更清晰的图片采样paint.setFilterBitmap(true);// 过滤一些if (bitmapConfig == null) {bitmapConfig = Bitmap.Config.ARGB_8888;}bitmap = bitmap.copy(bitmapConfig, true);Canvas canvas = new Canvas(bitmap);canvas.drawText(text, paddingLeft, paddingTop, paint);return bitmap;}
我们使用了Rx编程思维后,从起点到终点这条线一直是连着的,没有断掉,中间需要加需求(加水印、日志记录等)我们可以进行卡片式拦截,把上游的拦截成我们需要的新的,再将新的游下去,直到终点显示UI 。这种思维也叫链式思维 。
配合
其实是一个管理者,控制请求网络,请求是通过,请求的结果丢给处理,拿到结果后通过起点流向下去,显示UI 。
现在有一个需求:通过配合来获取 里面的项目总数据和Item数据 。
同样我们先用流程图来理清思路:
现在用代码实现:
创建客户端API
public interface WanAndroidApi {// 总数据@GET("project/tree/json")Observable getProject();// 异步线程 耗时操作// ITem数据@GET("project/list/{pageIndex}/json") // ?cid=294Observable getProjectItem(@Path("pageIndex") int pageIndex, @Query("cid") int cid);// 异步线程 耗时操作}
封装网络请求框架
public class HttpUtil {private static final String TAG = "HttpUtils";private static final String BASE_URL = "https://www.wanandroid.com/";/*** 根据各种配置创建出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();return new Retrofit.Builder().baseUrl(BASE_URL)//TODO 请求用OKHttp.client(okHttpClient)//TODO 响应用RxJava//添加一个json解析的工具.addConverterFactory(GsonConverterFactory.create(new Gson()))//添加RxJava处理工具.addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();}}
将服务器返回的JSON数据转换为
方式一:通过在线转化
方式二:使用 里面的插件进行转化
用来实现我们的数据流向
/*** TODO Retrofit+RxJava 查询 项目分类(总数据查询)* @param view*/@SuppressLint("CheckResult")public void getProjectAction(View view) {//获取网络APIapi.getProject().subscribeOn(Schedulers.io()) //上面异步.observeOn(AndroidSchedulers.mainThread()) //下面 主线程.subscribe(new Observer() {@Overridepublic void onSubscribe(Disposable d) {progressDialog = new ProgressDialog(UseActivity.this);progressDialog.setTitle("资源获取中....");progressDialog.show();}@Overridepublic void onNext(ProjectBean projectBean) {Log.d(TAG, "onNext: " + projectBean);textView.setText(projectBean.toString());}@Overridepublic void onError(Throwable e) {Log.d(TAG, "onError: " + e);}@Overridepublic void onComplete() {if (progressDialog != null) {progressDialog.dismiss();}}});}/*** TODO Retrofit+RxJava 查询 项目列表数据(Item数据查询)* @param view*/@SuppressLint("CheckResult")public void getProjectListAction(View view) {api.getProjectItem(3, 294).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer() {@Overridepublic void accept(ProjectItemBean projectItemBean) throws Exception {Log.d(TAG, "accept: " + projectItemBean);}});}