做一个自己想要的网络请求框架
前段时间做的一个项目,想了很多,尝试了很多,想想真是做的很过瘾的一个项目。
其中有一部分是应用了一个自己重新想出来的一个网络请求框架,当然不是一蹴而就的,也是经过的一段时间磨合的,期间项目里面的网络部分重构了两三次,这还是在开发任务很重的情况下进行的,现在想起来风险真是蛮大的,但是想法已经在脑袋里面形成了,只能感觉到之前的东西烂的已经没办法看了,所以就动手改,一发不可收拾啊。
您可能会想了,现在流行的网络框架太多了,什么RxJava,什么retrofit,都牛的很呢,我做的当然不能与他们相提并论,但是适用就好,那些一揽子方案整个打包过来一下子依赖好几个jar包,出了问题再去找原因就麻烦了,上车容易下车难啊。
说一下要达到的目标
- 请求的调用类与实际的请求工具类分离,不耦合
- 请求不使用回调函数,不直接引用回调
- 请求内实现默认的json解析,也可以在外部设置数据解析方式
- 内置请求结果缓存,缓存请求的结果(可选)
- 业务剥离,请求处理不与业务耦合,并方便业务逻辑实现
这些需求目前都已经实现,并且加了一些更加对调用者友好的部分,对可重用的部分用接口和泛型进行了重构,调用方式类似RxJava的方式,更加直观和友好,最终的调用类似下面这个样子
//这里的this可以是实现IMessageDispatcher的任意类型,然后把实现代理到默认的MessageDispatcher
//然后通过handle筛选和通知回调
UserProxy.instance().reuqestLogin(username, passwd).setFilterTask(new FilterTask<LoginResponse>() {
@Override
public void onExcute(LoginResponse result) {
}
}).register(this);
MessageDispatcher 的实现
public class MessageDispatcher implements IMessageDispatcher{
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Iterator<MessageFilter> iterator = messageFilters.iterator();
while (iterator.hasNext()) {
MessageFilter filter = iterator.next();
if(filter.compare(msg)){
filter.getFilterTask().onExcute(filter.getResult(msg));
iterator.remove();
}
}
}
};
List<MessageFilter> messageFilters = new ArrayList<>();
@Override
public void register(final MessageFilter messageFilter) {
handler.post(new Runnable() {
@Override
public void run() {
messageFilters.add(messageFilter);
}
});
}
@Override
public void unRegister(final MessageFilter messageFilter) {
handler.post(new Runnable() {
@Override
public void run() {
messageFilters.remove(messageFilter);
}
});
}
public void register(AppNotifier appNotifier){
appNotifier.registerObserver(handler);
}
public void unRegister(AppNotifier appNotifier){
appNotifier.unRegistrObserver(handler);
}
}
AppNotifier 的部分代码
public class AppNotifier {
private static List<ObServer> obServers = new ArrayList<>();
private AppNotifier(){
}
static class Instance{
static AppNotifier instance= new AppNotifier();
}
public static AppNotifier instance(){
return Instance.instance;
}
public void registerObserver(Handler handler){
synchronized (obServers){
Iterator<ObServer> it = obServers.iterator();
while (it.hasNext()) {
ObServer obServer = it.next();
Handler hand = obServer.handlerWeakReference.get();
if (hand == null || hand.equals(handler)) {
it.remove();
}
}
obServers.add(new ObServer(handler));
}
}
public void unRegistrObserver(Handler handler){
synchronized (obServers){
Iterator<ObServer> it = obServers.iterator();
while (it.hasNext()) {
ObServer obServer = it.next();
Handler hand = obServer.handlerWeakReference.get();
if (hand == null || hand.equals(handler)) {
it.remove();
}
}
}
}
public void notify(INotifyEntity requestEntity){
//省略日志处理
......
//省略日志处理
synchronized (obServers) {
Iterator<ObServer> it = obServers.iterator();
while (it.hasNext()){
ObServer obServer = it.next();
Handler handler = obServer.handlerWeakReference.get();
if(handler==null)
{
it.remove();
}else{
Message message = handler.obtainMessage();
message.obj = requestEntity;
message.what =TypeAppNotify;
message.sendToTarget();
}
}
}
}
private static class ObServer{
WeakReference<Handler> handlerWeakReference;
public ObServer(Handler handler) {
this.handlerWeakReference = new WeakReference<Handler>(handler);
}
}
}
主要的流程就是这样