转载请标明出处:
http://blog.csdn.net/qq_27495349/article/details/53037909
本文出自:【CF凌晨的博客】
引言
hello 大家好,没想到吧!我又回来了,回来了,来了,了(武器大师的话,我加了个特技,哈哈)。
好了开始我们今天的主题吧,昨天有人问我,该用什么网络框架,怎么用,怎么保证内存不泄露?
看到这个,我还是很激动的,毕竟是我写博客到现在第一个问我的问题。
那好,我就拿我经常用的网络框架(Retrofit),慢慢欣赏吧(买好瓜子哈)。
OKHTTP
总结一句话-->"略",哈哈,别打我,我还是个孩子。
这个不是今天的重点,而且这个东西出来这么久了,大家估计都用了,所以我就不讲了,大家自己脑补吧(google)。
Retrofit版本介绍
Retrofit是squareup公司完成的一个很吊的开源的网络框架,为什么这样说呢?,因为大家都说好啊。
其实这里我也想略的,但是又觉得不好意思,所以这次我扔个连接给你们,接住哈!!!
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0915/3460.html
Retrofit2使用
想必大家看了上面的文章,肯定不会再去使用retrofit1.X版本了,所以我直接就讲Retrofit2.X喽,好了,开始啦!!!
首先创建一个新的工程(名字随便你们喽)打开app/build.gradle(感觉有点多余哈,哈哈),在dependencies节点下面添加
(当然大家可以不按照我这个来)
//compile 'com.squareup.retrofit2:retrofit:2.1.0'
//retrofit2 转化器 gson
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
//引进Rxjava2.0
compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
//log拦截器
compile 'com.squareup.okhttp3:logging-interceptor:3.3.0'
注意:一定要保证添加的版本相同,要不然会有重复包或者冲突呦,直接按照我这个来得了哈,安全,绿色,多好啊。
这里呢大家可能看到了,我为什么把retrofit2.1.0注释掉了?
因为大部分我们都是使用Gson解析,我就直接引入了converter-gson。
这个就是可以直接把返回的数据通过gson解析成对象(都懂的)。
我们打开此包的pom文件(看下面),他已经引进了retrofit2.0版本,所以就不需要喽,以下同理哈(rxandroid- rxjava)
好了,大家可能也看到我也引进Rxjava2(rxandroid:2.0.0)了,这个留到最后。包引进之后呢,下面就可以撸代码了。
我们创建一个NetClient.java,大家看名字就知道了,好了直接上代码
package com.lingchen.netretrofit.net;
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Author lingchen
* Email [email protected]
* Time 2016/11/4
* Function 网络客户端
*/
public class NetClient {
//暂时放在这里
private static final String URL = "http://bobo.yimwing.com";
/**
* 获取Retrofit适配器。
*
* @return 网络适配器
*/
public static Retrofit newRetrofit() {
return new Retrofit.Builder().baseUrl(URL).client(getClient().build())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
/**
* 获取 OkHttpClient
*
* @return OkHttpClient
*/
public static OkHttpClient.Builder getClient() {
return new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(300, TimeUnit.SECONDS)
.addInterceptor(new HttpLoggingInterceptor());//日志
}
}
嗯,比较简单的,注释也很清楚哈。现在我们来写一个接口(不要问为什么哈,因为retrofit就是这样规定的,嘻嘻)。
package com.lingchen.netretrofit.net;
/**
* Author lingchen
* Email [email protected]
* Time 2016/11/4
* Function 网络接口 Retrofit().create()
*/
public interface ComInterface {
}
我们再来写一个类,来存放Retrofit实例。
/**
* Author lingchen
* Email [email protected]
* Time 2016/11/4
* Function 网络通用接口
*/
public class ComApi {
public static ComApi comApi;
private ComInterface mComInterface;
public static ComApi getInstance() {
synchronized (ComApi.class) {
if (comApi == null) {
comApi = new ComApi();
}
}
return comApi;
}
private ComApi() {
mComInterface = NetClient.newRetrofit().create(ComInterface.class);
}
}
好了这里大家可以看到了,此类为单例模式,而且含有retrofit创建出来的mComInterface(这就是retrofit的强大之后了)。
相比以前做过后台,使用过SpringMVC大家肯定会觉得很熟悉,貌似现在还看不出来,哈哈,别着急,现在还不是没有请求吗?)
准备工作准备了,我们开始来写个请求吧,这是我从公司挑来的,好,我们看下接口
http://bobo.yimwing.com/api/version/android_new
当我们拿到这个接口的时候,我们就应该去浏览器看看喽
{“code”:1,”data”:{“versionName”:”1.3.0”,”versionCode”:4,”isQiangzhi”:1,”url”:”http:\/\/bobo-sql.oss-cn-beijing.aliyuncs.com\/app-bobo-release.apk”,”updateContent”:”重要版本更新!”}}
这个就是大家常见的json数据啦,我们使用AS一个插件(GsonFormat)具体安装大家可以google哈。我已经安装了,我直接用啦
很明了吧?可以看到code=1肯定就是成功了,data里面存放就是版本的内容了,我们直接点击ok(要预先创建一个新类哈)
这里我们就要说下了,从这里就可以看到,后台返回的固定格式是int code,Object data(其实应该还有String msg,只是这个接口没返回而已)这里我之所以用Object,是因为不可能所有的返回类型都是我们版本数据,所以我们就要开始提取了
package com.lingchen.netretrofit.net;
/**
* Author lingchen
* Email 838878458@qq.com
* Time 2016/11/4
* Function 数据响应模型
*/
public class ResBaseModel<T> {
private static final int CODE_SUCCESS = 1;
/**
* data : {}
* code : 1
* msg : 操作成功
*/
private int code;
private String msg;
protected T data;
public String getMsg() {
return msg;
}
public T getData() {
return data;
}
public boolean isSuccess() {
return CODE_SUCCESS == code;
}
}
package com.lingchen.netretrofit.net.model;
/**
* Author lingchen
* Email [email protected]
* Time 2016/11/4
* Function 版本信息
*/
public class VersionModel {
/**
* versionName : 1.3.0
* versionCode : 4
* isQiangzhi : 1
* url : http://bobo-sql.oss-cn-beijing.aliyuncs.com/app-bobo-release.apk
* updateContent : 重要版本更新!
*/
private String versionName;
private int versionCode;
private int isQiangzhi;
private String url;
private String updateContent;
public String getVersionName() {
return versionName;
}
public void setVersionName(String versionName) {
this.versionName = versionName;
}
public int getVersionCode() {
return versionCode;
}
public void setVersionCode(int versionCode) {
this.versionCode = versionCode;
}
public int getIsQiangzhi() {
return isQiangzhi;
}
public void setIsQiangzhi(int isQiangzhi) {
this.isQiangzhi = isQiangzhi;
}
public String getUrl() {
return url;