框架地址:https://github.com/wyouflf/xUtils3
一般首页的数据往往加载都需要耗费很长的时间,所以有必要使用缓存来减少加载的时间。
在xutils3中进行网络请求一般只用两个方法
一个是Callback.CommonCallback
普通的网络请求
另一个是带缓存的Callback.CacheCallback
网络请求
请求方法:
//广告
public static void homeViewFipper(Callback.CommonCallback<String> callback){
RequestParams params = new RequestParams(MyURL.BaseUrl + "api/announcement");
params.addHeader("X-Auth-Token", mHelper.getToken().toString());
params.addHeader("Accept", "application/vnd.edusoho.v2+json");
x.http().get(params, callback);
}
//数据
public static void homeDatas(Callback.CacheCallback<String> callback) {
RequestParams params = new RequestParams(MyURL.BaseUrl + "api/index");
params.addHeader("X-Auth-Token", mHelper.getToken().toString());
params.addHeader("Accept", "application/vnd.edusoho.v2+json");
params.setCacheMaxAge(1000 * 60 * 60 * 7);
x.http().get(params, callback);
}
写法都相似,只不过带缓存的请求需要手动指定缓存过期时间。这里暂且设置为7天。
响应:
//不缓存
XNetWorkManager.homeViewFipper(new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String s) {
Type type = new TypeToken<List<FilpperBean>>() {
}.getType();
List<FilpperBean> filpperBeans = new Gson().fromJson(s, type);
LogUtils.e(filpperBeans.toString());
if (filpperBeans.size() == 0) {
mHomeVfRoot.setVisibility(View.GONE);
return;
}
for (int i = 0; i < filpperBeans.size(); i++) {
tv1.setText(filpperBeans.get(i).content);
}
mViews.add(moreView);
mHomeVf.setViews(mViews);
}
@Override
public void onError(Throwable throwable, boolean b) {
}
@Override
public void onCancelled(CancelledException e) {
}
@Override
public void onFinished() {
}
});
//缓存首页数据
private void getHomeDatas(final Boolean isRefresh) {
XNetWorkManager.homeDatas(new Callback.CacheCallback<String>() {
private Boolean errorCode = false;
private String result = "";
@Override
public boolean onCache(String s) {
this.result = s;
return isRefresh;
}
@Override
public void onSuccess(String s) {
if (s != null) {
this.result = s;
}
}
@Override
public void onError(Throwable throwable, boolean b) {
errorCode = true;
mHomeRefresh.finishRefresh();
}
@Override
public void onCancelled(CancelledException e) {
}
@Override
public void onFinished() {
mHomeRefresh.finishRefresh();
if (!errorCode && result != null) {
LogUtils.e(result.toString());
jsonHomeList(result);
}
}
});
}
onCache方法就是对缓存结果的回调,默认返回false(不信任缓存)
也就是说就算在请求的时候设置了缓存,这里不处理也是无法缓存的。
在设置为ture后,
注意:不要在onSuccess中获取数据,如果在信任缓存的情况下,再次请求数据,不会进入该方法。也就拿不到数据。
还有个问题是如果想要通过刷新来重新获取数据,那么也需要在刷新的监听里将缓存设置为不信任
@Override
public void onRefresh(RefreshLayout refreshlayout) {
mHomeTitle.setVisibility(View.INVISIBLE);
getHomeDatas(false);
}
但是在进入界面的时候,注意不要调用自动刷新的方法,
首次进入页面之间绕过刷新,
getHomeDatas(ture);
信任缓存,这样能保证在用户每次进入页面的时候不用重复请求数据。
日志:
首次加载成功后进入:
main, onSuccess(ClassFragments.java:250)
main, onFinished(ClassFragments.java:270)
失败
main, onError(ClassFragments.java:270)
刷新再次加载(此时已经有了缓存)
main, onCache(ClassFragments.java:227)
main, onSuccess(ClassFragments.java:250)
main, onFinished(ClassFragments.java:270)
关闭网络再加载
main, onError(ClassFragments.java:185)
main, onFinished(ClassFragments.java:270)