版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30519365/article/details/56483696
1.
总结:此网络框架基于
compile 'org.kymjs.kjframe:kjframe:2.6'
2.
基础功能
KJHttp是专为解决Android中Http通信而产生的,它在请求和响应层面做到了全自动构建和解析,主要用于Android快速开发。 KJHttp自带了数据缓存功能,你所访问的Http数据都将在本地建立一个缓存,默认的缓存时间是5分钟,也就是5分钟以内相同的请求都不会经过网络,而是从本地缓存中直接读取。当然对于及时性要求较高的新闻类应用,你也可以关闭这个特性或者只需要将缓存时间设置成0就行了~
httpconfig = new HttpConfig();
httpconfig.cacheTime = 0;
kjhttp = new KJHttp(httpconfig);
KJHttp支持JSON格式参数提交、AJAX方式的Form表单参数提交,文件与图片的上传下载,同时支持根据你的需求所发起的自定义Request。
工作原理
整个KJHttp工作流程:采用责任链设计模式,由三部分组成,类似设计可以类比Handle…Looper…MessageQueue
1. KJHttp负责不停向NetworkQueue(或CacheQueue实际还是NetworkQueue, 具体逻辑请查看 {@link CacheDispatcher})添加Request
2. 另一边由TaskThread不停从NetworkQueue中取Request并交给Network执行器(逻辑请查看 {@link NetworkDispatcher} ),
3. Network执行器将执行成功的NetworkResponse返回给TaskThead,并通过Request的定制方法 {@link Request#parseNetworkResponse()}封装成Response,最终交给分发器 {@link Delivery} 分发到主线程并调用HttpCallback相应的方法
3.实例并分析其网络的底层源码实现:
package com.example.administrator.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import org.kymjs.kjframe.KJHttp; import org.kymjs.kjframe.http.HttpCallBack; import static android.icu.lang.UCharacter.GraphemeClusterBreak.T; public class MainActivity extends AppCompatActivity { private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn=findviews(R.id.button); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { KJHttp http=new KJHttp(); String s = http.toString(); Log.i("gsc",s); http.get("http://www.cnblogs.com/iyangyuan/archive/2013/04/09/3011274.html", new HttpCallBack() { @Override public void onFailure(int errorNo, String strMsg) { super.onFailure(errorNo, strMsg); Log.i("gsc",strMsg); } @Override public void onSuccess(String t) { super.onSuccess(t); Log.i("gsc",t); } }); } }); } public <T extends View> T findviews(int res){ return (T) findViewById(res); } }分析:从
http.get 追到源码
半天没看出什么名堂:突然从
KJHttp
源码82行有点出路:
// 配置器 核心实现包装类 private HttpConfig mConfig
// 请求缓冲区 private final Map<String, Queue<Request<?>>> mWaitingRequests = new HashMap<>(); // 请求的序列化生成器 private final AtomicInteger mSequenceGenerator = new AtomicInteger(); // 当前正在执行请求的线程集合 private final Set<Request<?>> mCurrentRequests = new HashSet<>(); // 执行缓存任务的队列. private final PriorityBlockingQueue<Request<?>> mCacheQueue = new PriorityBlockingQueue<>(); // 需要执行网络请求的工作队列 private final PriorityBlockingQueue<Request<?>> mNetworkQueue = new PriorityBlockingQueue<>(); // 请求任务执行池 private final NetworkDispatcher[] mTaskThreads; // 缓存队列调度器 private CacheDispatcher mCacheDispatcher; // 配置器 private HttpConfig mConfig;追索到HttPConfig 源码:
* 网络请求执行器 **/
发现此类 public Network mNetwork;
追索到
Network源码:
httpResponse = mHttpStack.performRequest(request, headers);此段
发现可疑类
HttpStack mHttpStack;
在追溯源码草竟然是个接口顿时懵逼:
寻思一会:肯定有他的实现类:
ctrl+H:
眼前一亮:出现下面一段
/** * HttpUrlConnection方式实现 * * @author kymjs (http://www.kymjs.com/) . */ public class HttpConnectStack implements HttpStack { private static final String HEADER_CONTENT_TYPE = "Content-Type"; private final UrlRewriter mUrlRewriter;
总结:此网络框架基于
HttpUrlConnection