Retrofit搭建网络请求框架,所有项目可用

步骤一:创建RetrofitUtils工具
public abstract class RetrofitUtils {
//服务器路径
private static final String API_SERVER = "http://192.168.0.105:8080";
private static final String TEST_API = "http://retrofit.devwiki.net/";
private static Retrofit mRetrofit;
private static OkHttpClient mOkHttpClient;
/**
* 获取Retrofit对象
* @return Retrofit
*/
public static Retrofit getRetrofit() {

if (null == mRetrofit) {

if (null == mOkHttpClient) {
mOkHttpClient = OkHttp3Utils.getOkHttpClient();
}
mRetrofit = new Retrofit.Builder()
.baseUrl(TEST_API) //请求根目录,一般为服务器地址
.addConverterFactory(GsonConverterFactory.create())//添加Bean解析方法
//.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(mOkHttpClient) //添加网络请求的对象,此处为自定义的okhttpclitent
.build();
}
return mRetrofit;
}

}
源码说明:
写一个抽象的Retrofit方法,构建Retrofit对象,让后面的网络请求继承,用来获取Retrofit对象

步骤二:创建OKHttpClient对象
public class OkHttp3Utils {
private static OkHttpClient mOkHttpClient;
//设置缓存目录
private static File cacheDirectory = new File(new MyApplication().getApplicationContext().getCacheDir().getAbsolutePath(), "MyCache");
private static Cache cache = new Cache(cacheDirectory, 10 * 1024 * 1024);

public static OkHttpClient getOkHttpClient() {
if (null == mOkHttpClient) {
mOkHttpClient = new OkHttpClient.Builder()
.cookieJar(new MyCookiesManager())//设置一个自动管理cookies的管理器
//.addInterceptor(new MyIntercepter()) //添加拦截器
//.addNetworkInterceptor(new CookiesInterceptor(MyApplication.getInstance().getApplicationContext()))//添加网络连接器
//设置请求读写的超时时间
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.cache(cache) //设置缓存
.build();
}
return mOkHttpClient;
}
}
源码说明:构建一个可以缓存网络请求数据的Client,用来在断网的情况下用户仍可以看到缓存的网络内容,添加了一个自定义的cookies的管理器

步骤三:创建MyCookiesManager网络数据cookie管理工具
public class MyCookiesManager implements CookieJar {
//缓存在内存中
private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();

@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
cookieStore.put(url, cookies); //将url地址上的cookies保存到内存中
}

@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> cookies = cookieStore.get(url); //根据url获取其地址上的所有cookies
return cookies != null ? cookies : new ArrayList<Cookie>();
}
}
源码说明:以KV值的形式保存网络请求中的数据,每个url可能对应多个cookie,取出的时候页都取出

步骤四:开始创建网络请求
public class NetWorks extends RetrofitUtils{
//创建实现接口调用
protected static final NetService service = getRetrofit().create(NetService.class);

//设缓存有效期为1天
protected static final long CACHE_STALE_SEC = 60 * 60 * 24 * 1;
//查询缓存的Cache-Control设置,使用缓存
protected static final String CACHE_CONTROL_CACHE =
"only-if-cached, max-stale=" +CACHE_STALE_SEC;
//查询网络的Cache-Control设置。不使用缓存
protected static final String CACHE_CONTROL_NETWORK = "max-age=0";

//创建业务请求接口
public interface NetService {
//用Retrofit接口测试工具来测试
@GET(" param")
Call<Test> testRetrofit(@Query(" id") int id);
//上面这个GET请求等同于Http://localhost:8080/ param? id= id
}
//测试retrofit接口,get请求 参数id,返回json字符串
public static void getTest(int id, final getTestCallback stringCallback){
final Call<Test> stringCall = service.testRetrofit(id); //创建call对象
stringCall.enqueue(new Callback<Test>() { //异步加载执行,以接口为参数取出返回值
@Override
public void onResponse(Call<Test> call, Response<Test> response) {
Test test = response.body();
LogUtils.w("NetWorks测试",test.toString());
stringCallback.onSucess(test); //将返回内容放入作为参数的自定义接口中
}

@Override
public void onFailure(Call<Test> call, Throwable t) {
stringCallback.onFailed(t);
}
});
}
}
代码说明:Retrofit请求以@注册的形式将路径,地址,请求方法,参数等引用,用Retrofit.creater方法创建service,调用方法,创建Call对象,然后执行异步加载,接收返回内容,放入作为参数的自定义接口的方法中,供以后使用时调用

步骤五:自定义的接收返回内容的接口
public interface getTestCallback<T> { //接口作为参数的形式,回调网络返回内容
void onSucess(T test); //数据返回成功,将数据T放入该方法,
void onFailed(Throwable t); //数据返回失败,将失败原因放入该方法
}
代码说明:http://localhost:8080/param?id=4444
返回的数据为 {"code":10001,"desc":"success","data":{"id":"4444"}}
是一个JsonObject类型的值,要用T类型的Bean来接收Test test = response.body();
将上面的字符串放入GsonFormat中,构造用来接收数据的包装Bean,如下:
public class Test {
/**
* code : 10001
* desc : success
* data : {"id":"11123"}
*/
private int code;
private String desc;
/**
* id : 11123
*/
private DataBean data;
public static class DataBean {
private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}
//{"code":10001,"desc":"success","data":{"id":"11123"}}
。。。省略get、set方法和toString 方法
}

步骤六:从想要获取数据的层调用上面的方法,获取网络请求参数
public class MainActivity extends AppCompatActivity {

protected void onCreate(Bundle savedInstanceState) {
NetWorks.getTest(4444, new getTestCallback<Test>() { //发送参数id=4444,接收返回值
@Override
public void onSucess(Test test) {
LogUtils.w("成功获取",test.getData().toString()); //成功时可做隐藏进度条等操作
}

@Override
public void onFailed(Throwable error) { //失败时可控制显示一个“联网失败”的操作
LogUtils.w("失败原因",error.toString());
}
});
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四角天空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值