解耦Retrofit+Rxjava+Gson请求处理Json对象
废话
最近在做一个面试项目,需求很简单,就是网络请求Json,然后显示在ListView中。
正好,简单的需求可以让我自由自在地玩弄一下代码,正好学了这么久的设计模式,我的解耦大刀早已饥渴难耐。
一般做法
网络请求一个Json并处理的一般步骤,在这里简单的说一下。
首先构造Retrofit需要的API接口,然后使用Retrofit.create()给这个接口加上动态代理来,最后利用这个接口的方法,
获取到需要的Observable对象。
接下来利用Observable对象对得到的返回结果进行处理。
解耦效果
最终,我写了一个高度聚合的模块,看看要完成上面这些步奏,我们的代码已经简化到这种程度:
|
1
|
new FactsHandler<Facts>(new TestFactsHandler(),baseUrl,jsonFile).exec();
|
其中Facts泛型类型是Json对应的JavaBean类型,这个TestFactsHandler是接口ICustomerFactsHandler的实现类,
这个接口的定义如下:
|
1
2
3
|
public interface ICustomerFactsHandler<J> {
public void handle(J jsonObject);
}
|
这个接口就是用来处理网络请求的返回结果的,这个结果就是经过Gson解析过后的Facts对象。
所以,当我们需要自定义处理逻辑的时候,直接实现ICustomerFactsHandler就行啦~
源代码
具体解耦套路使用了静态工厂+ 策略模式,代码其实很简单,就是在泛型转换的时候多挣扎了一下(不扎实唉···)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
public class FactsHandler<J> {
public static final String TAG = "FactHandler";
// 默认构造参数,用于测试
public static final String DEFAULT_JSON = "facts.json";
private static final String BASE_URL = "https://raw.githubusercontent.com/goeasyway/SimpleListDemo/master/";
private ICustomerFactsHandler mHandler;
private String mBaseUrl;
private String mJsonFile;
public FactsHandler(ICustomerFactsHandler handler) {
this(handler, BASE_URL, DEFAULT_JSON);
}
public FactsHandler(ICustomerFactsHandler handler, String baseUrl, String jsonFile) {
mHandler = handler;
mBaseUrl = baseUrl;
mJsonFile = jsonFile;
}
/**
* 在主线程中执行处理函数
*/
public void exec() {
Observable<J> observable = (Observable<J>) ObserverFactory
.create(mBaseUrl, mJsonFile);
observable.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(facts -> {
mHandler.handle(facts);
});
}
/**
* 更改处理方法
*
* @param handler 实现{@link ICustomerFactsHandler}接口。
*/
public void setHandler(ICustomerFactsHandler handler) {
mHandler = handler;
}
/**
* Observer工厂类
* 用于生产一个用网络io请求json的Observable对象
*/
private static class ObserverFactory {
/**
* @param baseUrl 基Url
* @param json json对象名
* @param <T> Retrofit的API接口类型
* @return 装配好的Observable,可直接调用。
*/
static <T extends JsonService> Observable<?> create(String baseUrl, String json) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
.addConverterFactory(GsonConverterFactory.create())
.build();
T jsonService = retrofit.create((Class<T>) JsonService.class);
Observable<?> observable = jsonService.fetchJsonFeed(json);
return observable;
}
}
}
|
最后
自从学了设计模式,看见什么都tm是耦合的,看见什么都tm想解耦!

浙公网安备 33010602011771号