RxJava 筆記
注意:這只是學(xué)習(xí)的過程,為了學(xué)習(xí)rxjava是怎么由callback嵌套轉(zhuǎn)換而來霞幅,其中的map和flatMap 都只是精簡(jiǎn)過后的一個(gè)概念,不是真正的樣子
感謝
W_BinaryTree
2樓 · 2017.05.12 01:07
flatMap不僅僅是把item封裝成observable量瓜。 還有個(gè)merge的過程司恳。
同步時(shí)
Response newsList = netApi.getNewsList(0,10);
String title = findLatestTitle(newsList);
Uri uri = netApi.save(title);
異步時(shí)嵌套
1. 三個(gè)不同的接口
public class MainActivity extends AppCompatActivity {
String url = "http://op.juhe.cn/yi18/news/newsclass";
interface ApiCallback {
void onSuccess(String data);
void onError(Throwable e);
}
interface TransferCallback {
void onSuccess(Data data);
void onError(Throwable e);
}
interface ResultCallback {
void onSuccess(Uri uri);
void onError(Throwable e);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("ss", "sss");
findViewById(R.id.btn).setOnClickListener(v -> {
request(new ApiCallback() {
@Override
public void onSuccess(String data) {
Data dat = tansfer(data);
save(data, new ResultCallback() {
@Override
public void onSuccess(Uri uri) {
}
@Override
public void onError(Throwable e) {
}
});
});
}
@Override
public void onError(Throwable e) {
}
});
});
}
/**
* 1. 請(qǐng)求網(wǎng)絡(luò)獲取數(shù)據(jù)
*
* @param apiCallback
*/
public void request(ApiCallback apiCallback) {
OkGo.get(url)
.params("key", "2e6f34e3fe8fa96e5384021477f8e224")
.execute(new StringCallback() {
@Override
public void onSuccess(String s, Call call, Response response) {
Log.d("MainActivity", "onSuccess: " + s);
apiCallback.onSuccess(s);
}
@Override
public void onError(Call call, Response response, Exception e) {
apiCallback.onError(e);
}
});
}
/**
* 2. 將獲取的數(shù)據(jù)轉(zhuǎn)換成對(duì)象
*/
public Data tansfer(String s) {
Data data = GsonUtils.GsonToBean(s, Data.class);
return data;
}
/**
* 3.將對(duì)象中的某個(gè)數(shù)據(jù)保存
*/
public void save(Data data, ResultCallback resultCallback) {
try {
ResultBean result = data.getResult();
ListBean list = result.getList();
List<TngouBean> tngou = list.getTngou();
String s = GsonUtils.GsonString(list);
SharedPreferences config = getSharedPreferences("config", MODE_PRIVATE);
config.edit().putString("tag", s).apply();
resultCallback.onSuccess(Uri.parse(s));
} catch (Throwable e) {
resultCallback.onError(e);
}
}
}
2. 將三個(gè)接口改為同一個(gè)接口,用泛型來確定onSuccess()
的內(nèi)容
public class MainActivity extends AppCompatActivity {
String url = "http://op.juhe.cn/yi18/news/newsclass";
interface Callback<T> {
void onSuccess(T data);
void onError(Throwable e);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("ss", "sss");
findViewById(R.id.btn).setOnClickListener(v -> {
request(new Callback<String>() {
@Override
public void onSuccess(String data) {
tansfer(data, new Callback<Data>() {
@Override
public void onSuccess(Data data) {
save(data, new Callback<Uri>() {
@Override
public void onSuccess(Uri uri) {
}
@Override
public void onError(Throwable e) {
}
});
}
@Override
public void onError(Throwable e) {
}
});
}
@Override
public void onError(Throwable e) {
}
});
});
}
/**
* 1. 請(qǐng)求網(wǎng)絡(luò)獲取數(shù)據(jù)
*
* @param apiCallback
*/
public void request(Callback apiCallback) {
OkGo.get(url)
.params("key", "2e6f34e3fe8fa96e5384021477f8e224")
.execute(new StringCallback() {
@Override
public void onSuccess(String s, Call call, Response response) {
Log.d("MainActivity", "onSuccess: " + s);
apiCallback.onSuccess(s);
}
@Override
public void onError(Call call, Response response, Exception e) {
apiCallback.onError(e);
}
});
}
/**
* 2. 將獲取的數(shù)據(jù)轉(zhuǎn)換成對(duì)象
*
* @param transferCallback
*/
public void tansfer(String s, Callback transferCallback) {
try {
Data data = GsonUtils.GsonToBean(s, Data.class);
transferCallback.onSuccess(data);
} catch (Throwable throwable) {
transferCallback.onError(throwable);
}
}
/**
* 3.將對(duì)象中的某個(gè)數(shù)據(jù)保存
*/
public void save(Data data, Callback resultCallback) {
try {
ResultBean result = data.getResult();
ListBean list = result.getList();
List<TngouBean> tngou = list.getTngou();
String s = GsonUtils.GsonString(list);
SharedPreferences config = getSharedPreferences("config", MODE_PRIVATE);
config.edit().putString("tag", s).apply();
resultCallback.onSuccess(Uri.parse(s));
} catch (Throwable e) {
resultCallback.onError(e);
}
}
}
3. 第三步,讓異步方法有返回值绍傲,從而避免嵌套
異步操作是沒有返回值的扔傅,但是我們可以返回一個(gè)可以把傳遞進(jìn)來的參數(shù)變成結(jié)果的步驟(動(dòng)作/Action)
獲得一個(gè)抽象類AsyncJob
這個(gè)AsyncJob
接收一個(gè)Callback
,有一個(gè)start()
的方法
public interface AsyncJob<T> {
void start(Callback<T> callback);
}
這個(gè)start()
方法就是要執(zhí)行的動(dòng)作,
回到剛才話題
- 創(chuàng)建異步任務(wù)的時(shí)候是沒有返回值的
- 所以我們要返回一個(gè)含有將傳遞進(jìn)來的參數(shù)轉(zhuǎn)變成結(jié)果的動(dòng)作,
AsyncJob
是返回結(jié)果,start()
就是動(dòng)作 - 啟動(dòng)這個(gè)任務(wù)的時(shí)候需要的這個(gè)
Callback
中則會(huì)將成功/失敗的結(jié)果傳遞出去
將行為封裝后烫饼,這樣每次執(zhí)行后就可以獲得一個(gè)返回值(這個(gè)返回值實(shí)際上就是一個(gè)方法包裝)
這樣行為的封裝結(jié)果有了猎塞,那么就可以像同步方法一樣執(zhí)行一步一步的操作了;
map/faltMap操作符做了點(diǎn)什么
-
使用前/抽離前
AsyncJob<Model> modelAsyncJob2 = new AsyncJob<Model>() { @Override public void start(RxCallback<Model> rxCallback) { //responseAsyncJob 是上個(gè)AsyncJob對(duì)象 responseAsyncJob.start(new RxCallback<Response>() { @Override public void onSuccess(Response response) { //除了下面這一行其他都是模板代碼杠纵,所以應(yīng)該抽離出來 Model convert = convert(response); rxCallback.onSuccess(convert); } @Override public void onError(Throwable e) { rxCallback.onError(e); } }); } };
-
使用后/抽離后
//responseAsyncJob 是上個(gè)AsyncJob對(duì)象 AsyncJob<Model> modelAsyncJob1 = responseAsyncJob.map(new FunC1<Response, Model>() { @Override public Model call(Response response) { Model model = convert(response); return model; } });
?
-
map操作符做了點(diǎn)什么
public <R> AsyncJob<R> map(FunC1<T, R> funC1) { //1. source 就是上一個(gè)資源 (上次對(duì)象) AsyncJob<T> source = this; //2. 這里的new 對(duì)象就是返回的對(duì)象(簡(jiǎn)稱本次對(duì)象) return new AsyncJob<R>() { //3. 這里表示本次執(zhí)行(start())的時(shí)候荠耽,(調(diào)用start方法的時(shí)候,會(huì)去先執(zhí)行上個(gè)對(duì)象的start()方法) @Override //4. 本個(gè)對(duì)象的start()方法 public void start(RxCallback<R> callback) { //5. 上個(gè)對(duì)象start()方法 source.start(new RxCallback<T>() { @Override public void onSuccess(T t) { //5.5 如果上個(gè)對(duì)象的start方法成功了 //6.0這里有一個(gè)不確定的函數(shù)淡诗,這個(gè)函數(shù)聲明了將一個(gè)T骇塘,類型的參數(shù)轉(zhuǎn)換為一個(gè)R類型 R result = funC1.call(t); //7 -a將成功結(jié)果傳遞出去 callback.onSuccess(result); } @Override public void onError(Throwable e) { //7- b 將結(jié)果傳遞出去 callback.onError(e); } }); } }; }
-
flatMap 做了點(diǎn)什么
public <R> AsyncJob<R> flatMap(FunC1<T, AsyncJob<R>> funC1) { //1. 保存上個(gè)對(duì)象 AsyncJob<T> source = this; //2. 返回本次對(duì)象 return new AsyncJob<R>() { //3. 表示本次對(duì)象執(zhí)行 @Override public void start(RxCallback<R> callback) { //4. 表示執(zhí)行時(shí)首先會(huì)執(zhí)行上個(gè)對(duì)象的start()方法 source.start(new RxCallback<T>() { @Override public void onSuccess(T t) { //5. 在上個(gè)對(duì)象成功中使用傳入的抽象動(dòng)作伊履,將一個(gè)參數(shù)轉(zhuǎn)換為另外一個(gè)AsyncJob對(duì)象 AsyncJob<R> call = funC1.call(t); //6. 調(diào)用這個(gè)AsyncJob對(duì)象的start()方法 call.start(new RxCallback<R>() { @Override public void onSuccess(R r) { //7. 在成功時(shí)將結(jié)果傳遞出去 callback.onSuccess(r); } @Override public void onError(Throwable e) { callback.onError(e); } }); } @Override public void onError(Throwable e) { callback.onError(e); } }); } }; }
?
map
和flatMap
是哪里不一樣韩容?
map
中接收的接口中的泛型是<T,R>
說明map
操作符中Func1
接口的call
方法的返回值是一個(gè)R
類型的參數(shù)
@Override
public Model call(Response response) {
Model model = convert(response);
return model;
}
?
flatmap
中接收的接口中的泛型是<T,Observable<R>>
說明flatmap
操作符中Func1
接口的call
方法的返回值是一個(gè)Observable<R>
類型的參數(shù)
@Override
public AsyncJob<Uri> call(Model model) {
AsyncJob<Uri> save = save(model);
return save;
}
?
?
封裝完成前后的對(duì)比
沒有進(jìn)行封裝,需要傳遞CallBack的原始方法(含有嵌套操作)
public void getResult(String url, RxCallback<Uri> rxCallback) {
netApi.get(url, new RxCallback<Response>() {
@Override
public void onSuccess(Response response) {
Model model = convert(response);
save(model, new RxCallback<Uri>() {
@Override
public void onSuccess(Uri uri) {
rxCallback.onSuccess(uri);
}
@Override
public void onError(Throwable e) {
rxCallback.onError(e);
}
});
}
@Override
public void onError(Throwable e) {
rxCallback.onError(e);
}
});
}
使用封裝了start()函數(shù)后
public AsyncJob<Uri> getResult(String url) {
AsyncJob<Response> responseAsyncJob = netApi.get(url);
AsyncJob<Model> modelAsyncJob = new AsyncJob<Model>() {
@Override
public void start(RxCallback<Model> rxCallback) {
responseAsyncJob.start(new RxCallback<Response>() {
@Override
public void onSuccess(Response response) {
Model convert = convert(response);
rxCallback.onSuccess(convert);
}
@Override
public void onError(Throwable e) {
rxCallback.onError(e);
}
});
}
};
AsyncJob<Uri> uriAsyncJob = new AsyncJob<Uri>() {
@Override
public void start(RxCallback<Uri> rxCallback) {
modelAsyncJob.start(new RxCallback<Model>() {
@Override
public void onSuccess(Model model) {
AsyncJob<Uri> save = save(model);
save.start(new RxCallback<Uri>() {
@Override
public void onSuccess(Uri uri) {
rxCallback.onSuccess(uri);
}
@Override
public void onError(Throwable e) {
rxCallback.onError(e);
}
});
}
@Override
public void onError(Throwable e) {
rxCallback.onError(e);
}
});
}
};
return uriAsyncJob;
}
封裝了map操作符 和flatMap 操作符
public AsyncJob<Uri> getResult(String url) {
AsyncJob<Response> responseAsyncJob = netApi.get(url);
AsyncJob<Model> modelAsyncJob1 = responseAsyncJob.map(new FunC1<Response, Model>() {
@Override
public Model call(Response response) {
Model model = convert(response);
return model;
}
});
AsyncJob<Uri> uriAsyncJob = modelAsyncJob1.flatMap(new FunC1<Model, AsyncJob<Uri>>() {
@Override
public AsyncJob<Uri> call(Model model) {
AsyncJob<Uri> save = save(model);
return save;
}
});
}
封裝完成 唐瀑,lambda化后
public AsyncJob<Uri> getResult(String url) {
return netApi.get(url)
.map(this::convert)
.flatMap(this::save);
}