您的位置:首页 > 理论基础 > 计算机网络

OkHttp架构——三层网络架构封装(最实用的框架)

2017-01-13 12:05 387 查看


图片是以截图开源中国的登录界面

介绍

开发中我们要使用到不同的网络的工具,如xUtils、OKHttp、NoHttp等工具,根据开发的不同情况,需要更换工具,这样在Activity需要不断的更换代码,耦合性比较高。

因此我们需要来搭建网络架构,进行架构封装,解耦操作,优化代码量,降低耦合性

1、登录Activity请求数据为例,对OkHttp进行封装

这是一段OKHttp网络工具使用的普遍流程,用来请求登录的账户和密码数据,这样使用的弊端:

1.代码量比价冗杂

2.在获取不同的数据的时候,代码重复率高,网络对象不断创建,消耗内存

3.在更该网络地址或者网络工具的时候,需要进行一个一个更改,并且修改你自己的源码。浪费时间,降低工作效率

public class LoginActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
log();
}
/**登录方法**/
private void log() {
//获取实例
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(3000, TimeUnit.MILLISECONDS)//获取数据并读取数据的超时时间
.connectTimeout(3000,TimeUnit.MILLISECONDS)//连接超时时间
.build();
String url = "http://www.oschina.com/api?action=login&account=xx&password=xx";//登录请求数据
//获取请求
Request request = new Request.Builder().url(url).build();
Call call = client.newCall(request);
//实现回调
call.enqueue(new Callback() {

@Override
public void onResponse(Call call, Response response) throws IOException {
//获取数据成功
String json = response.body();//获取Json数据或者Xml数据,以字符串形式展示
//InputStream inputStream = response.body().byteStream();或者是获取数据字符输入流
}
@Override
public void onFailure(Call call, IOException e) {
//获取数据失败
}
});
}


一:第一层封装

1、提取 NetClient,整个任务栈中保证只有一个OkHttpClient对象就行

public class NetClient {

private final OkHttpClient client;
private OkHttpClient getClient(){
//获取实例
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(3000, TimeUnit.MILLISECONDS)//获取数据并读取数据的超时时间
.connectTimeout(3000,TimeUnit.MILLISECONDS)//连接超时时间
.build();
return client;
}
}


2、实现NetClient的单例模式,保证只有一个对象

public class NetClient {

private static NetClient netClient;

private NetClient(){
client = getClient();
}
//单例模式
public static NetClient getInstance(){
if (netClient==null){
netClient = new NetClient();
}
return netClient;
}

private final OkHttpClient client;

private OkHttpClient getClient(){
//获取实例
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(3000, TimeUnit.MILLISECONDS)//获取数据并读取数据的超时时间
.connectTimeout(3000,TimeUnit.MILLISECONDS)//连接超时时间
.build();
return client;
}
}


3、封装请求方法

public class NetClient {

private static NetClient netClient;

private NetClient(){
client = getClient();
}

public static NetClient getInstance(){
if (netClient==null){
netClient = new NetClient();
}
return netClient;
}

private final OkHttpClient client;

private OkHttpClient getClient(){
//获取实例
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(3000, TimeUnit.MILLISECONDS)//获取数据并读取数据的超时时间
.connectTimeout(3000,TimeUnit.MILLISECONDS)//连接超时时间
.build();
return client;
}
//封装请求方法,传入一个url,以及使用自己定义的接口 MyCallBack
1:为什么要自己定义callback接口呢?
因为我们如果不更换接口,继续使用OKHttp的callback,你一旦更换网络工具,你的源码就必须的更改

public void doGet(String url, final MyCallBack callback){
Request request = new Request.Builder().url(url).build();

Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 更新界面..
callback.onFailure(-1);
}

@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.code()==200){
InputStream inputStream = response.body().byteStream();
callback.onResponse(inputStream);
}else{
callback.onFailure(response.code());
}

}
});
}
}


二:第二层封装

1、自定义接口MyCallBack。解耦网络回调。API 可以不再关心底层的网络类。

public interface MyCallBack {

void onFailure(int code);//失败方法,参数是请求码,来判断获取数据的情况

void onResponse(InputStream in);//请求成功,传入一个输入流参数
}


三:第三层封装

1、 提取 NetApi ,封装 API 请求参数。界面上可以不再关心网络参数

在NetApi中定义logIN方法,这样就实现网络参数更改变动,“一处改,百处变”

public class NetApi {
private static final String HOST = "http://www.oschian.com/";

public static void login(String account, String password, MyCallBack callback) {
String url = HOST + "api?action=login&name="+account+"&mima="+password;
NetClient.getInstance().doGet(url,callback);
}
}


2、最后Activity中代码实现网络请求,只需要一行代码就可以

public class LoginActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
log();
}
/**登录请求**/
private void log() {
NetApi.login("xxx","xxx",new MyCallBack() {
@Override
public void onFailure(int code) {
// 获取数据失败
}
@Override
public void onResponse(InputStream in) {
// 解析数据, 更新界面..
}
});
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息