一、Rxjava 的核心思想
1、发布订阅模式,发布者发布信息,订阅者如果订阅了该信息,那么就可以获取该信息
2、举个例子: 下载图片 需要展示在ImageView上,下载图片相当于发布者,显示在ImageView上相当于订阅者,订阅者时刻观察发布者的动态,当下载图片完成后,立马显示在ImageView上
3、一件事情,有起点(下载图片) 有终点(展示在ImageView上)在这中间可以穿插任何的卡片信息
4、 比如在到达终点之前,可以给图片加上水印信息,这些都可以看做是穿插的卡片信息,上代码
private final static String PATH = "http://pic1.win4000.com/wallpaper/c/53cdd1f7c1f21.jpg";
public void downLoad(View view) {
Observable
.just(PATH) // 起点,内部会分发Path String todo 第二部
// TODO 第三步, 请求网络下载图片
.map(new Function<String, Bitmap>() {
@Override
public Bitmap apply(String path) throws Exception {
URL url = new URL(PATH);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(5000);
int responseCode = httpURLConnection.getResponseCode(); // 才开始 request
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream inputStream = httpURLConnection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
Thread.sleep(500);
return bitmap;
}
return null;
}
})
// 可以给下载好的图片加上水印,这里相当于穿插卡片信息
.map(new Function<Bitmap, Bitmap>() {
@Override
public Bitmap apply(Bitmap bitmap) throws Exception {
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setTextSize(88);
return drawTextToBitmap(bitmap,"李国菁签名",paint,88,88);
}
})
.subscribeOn(Schedulers.io())//让上面被观察者,处于子线程
.observeOn(AndroidSchedulers.mainThread())// 让下面观察者处于 主线程
.subscribe(new Observer<Bitmap>() {
// 一定是主线程,为什么,因为 subscribe 马上调用onSubscribe
@Override
public void onSubscribe(Disposable d) {
// 预备 开始 要分发
// TODO 第一步
dialog = new ProgressDialog(DownLoadingActivity.this);
dialog.setTitle("正在加载中...");
dialog.show();
}
@Override
public void onNext(Bitmap bitmap) {
// TODO 第四步 设置 bitmap
ivImage.setImageBitmap(bitmap);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
// TODO 第五步 完成事件,取消Loading框
if (dialog != null){
dialog.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;
}
二、Rxjava结合 Retrofit 的使用
public class HttpUtils {
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
* */
public static Retrofit getRetrofit(){
OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();
OkHttpClient httpClient = httpBuilder
.addNetworkInterceptor(new StethoInterceptor())
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
return new Retrofit.Builder()
.baseUrl(BASE_URL)
// TODO 请求用 OKhttp
.client(httpClient)
// TODO 响应RxJava
// 添加一个json解析的工具
.addConverterFactory(GsonConverterFactory.create(new Gson()))
// 添加rxjava处理工具
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
}
public interface WanAndroidApi {
// 总数据
@GET("project/tree/json")
Observable<ProjectBean> getProject(); // 异步线程 耗时操作
// Item数据
@GET("project/list/{pageIndex}/json") // ?cid=294
Observable<ProjectItem> getProjectItem(@Part("pageIndex") int pageIndex, @Query("cid") int cid);
}
private WanAndroidApi api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rx_java);
ivImage = findViewById(R.id.ivImage);
api = HttpUtils.getRetrofit().create(WanAndroidApi.class);
}
/**
* TODO Retrofit+RxJava 查询 项目分类 (总数据查询)
* @param view
*/
public void rxjavaRetrofit(View view) {
// 获取网络API
api.getProject()
.subscribeOn(Schedulers.io()) // 上面 异步
.observeOn(AndroidSchedulers.mainThread()) // 下面 主线程
.subscribe(new Consumer<ProjectBean>() {
@Override
public void accept(ProjectBean projectBean) throws Exception {
Log.i(TAG, "accept: " + projectBean); // UI 可以做事情
}
});
}
三、Rxjava 源码分析
如下图所示:
public class RxjavaTest2 {
public static void main(String[] args) {
Observable.create(
// new 了一个 ObservableCreate 自定义数据源 == source,
new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
System.out.println("2222222222");
e.onNext("hehehe");
}
})
// 上面返回: ObservableCreate.map
.map(new Function<String, Integer>() {
@Override
public Integer apply(String s) throws Exception {
System.out.println("33333333333 :" + s);
return 895842;
}
})
// 上面返回: ObservableCreate.map
.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
System.out.println("1111111111111");
}
@Override
public void onNext(Integer s) {
System.out.println("444444444 :" + s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}