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

xutils3网络请求结合下拉刷新事件处理缓存

2017-12-25 19:03 387 查看
框架地址: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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐