解耦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;
}
 
 
/**
* 在主线程中执行处理函数
*/
@SuppressWarnings("unchecked")
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对象
*/
@SuppressWarnings({"unchecked", "UnnecessaryLocalVariable"})
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想解耦!

posted @ 2017-08-09 17:16  天涯海角路  阅读(1141)  评论(0)    收藏  举报