最近的项目中遇到了需要使用okhttp进行数据交互,同时需要使用mvp架构,在调研这个模块的时候补充了一些自己一知半解的知识,现将它记录下来。
1、同步、异步请求
同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕
异步请求涉及到多线程问题,android所有的请求必须是异步,主线程不支持网络请求,以使它不被阻塞。这样的话就涉及到了多线程以及稍微高级一些的线程池技术。
在之前的项目开发中发现:部分手机对于某个应用能够开启的最大数有限制(例华为荣耀6),并且线程开的越多就越有oom的风险。
2、okhttp的 get,post方法
get和post区别如下:
(1)get是从服务器上获取数据,post是向服务器传送数据。
(1) 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
(2) 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
(2) GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
(3) 安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。
总结上面的主要几点:get是通过url来传送数据,post是将数据放入到header中:
get和post方式在okhttp中的应用:
get请求:
OkHttpClientManager ocm = OkHttpClientManager.getInstance();
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
Request request = new Request.Builder().url("http://121.43.156.50/api/v0/doctor/cc056df9-cf24-464f-bb5e-d2b715b610dc?accessToken=464e34e2-6957-4baf-978f-c908dc2d985b").build();
Response response;
// response = client.newCall(request).execute();
client.newCall(request).enqueue(cb);
Log.d("thread info request", Thread.currentThread().getName());
}
});
excutorServiceManager.getExecutor().execute(thread);
处理返回的数据:
Callback cb = new Callback() {
@Override
public void onFailure(Request request, IOException e) {
e.printStackTrace();
Log.e(TAG, "cannot get accesstoken");
}
@Override
public void onResponse(Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
String rp = response.body().string();
Log.e(TAG, "response: "+rp);
Log.d("thread info callback", Thread.currentThread().getName());
doctor = new Gson().fromJson(rp, DoctorBean.class);
handler.post(new Runnable() {
@Override public void run() {
show();
}
});
}
};
mDoctorModel.load(cb);
post请求类似,只是需要加上header就可以了。
3、线程、线程池
关于对okhttp线程的说明:
在项目中使用的是mvp和okhttp结合,在android中访问数据时通过异步请求,所以会创建一个thread,但是callback执行的时候也是一个异步请求。但是有不同的是request时的请求时自己创建的,callback是okhttpclientmanager自己创建并维护的。callback的进程个数数量可以不用考虑,但是自己创建的thread性能上有很大的问题。
对于上面的这种情况,引入了可以重用的线程池,
四种线程池中的:newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
代码如下:
package qingfengmy.mvp.utils;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorServiceManager {
private static ExecutorServiceManager mInstance;
private ExecutorService executor;
private ExecutorServiceManager(){
this.executor = Executors.newFixedThreadPool(6);
}
public static ExecutorServiceManager getInstance()
{
if (mInstance == null)
{
synchronized (ExecutorServiceManager.class)
{
if (mInstance == null)
{
mInstance = new ExecutorServiceManager();
}
}
}
return mInstance;
}
public ExecutorService getExecutor() {
return executor;
}
public void setExecutor(ExecutorService executor) {
this.executor = executor;
}
}
然后在modelimpl去创建thread,然后把它加入到executorservice中。
代码
http://download.csdn.net/detail/mcdullsin/9214905
ps:okhttp需要jdk 1.7以上的版本.