android网络优化之添加缓存给服务器减负
引言:
在app的很多实用过程中,经常会出现频繁的刷新操作,这个刷新不是指去更新ui,而是类似打开界面—关闭界面—再打开—再关闭等。这段过程中,并没有实质的数据变化,但是这个操作过程中,却会频繁的调用接口,初始化数据,然后去刷新UI,当然还有很多其他场景。这类频繁的无效的数据访问,无疑会增加网络请求的次数,给服务器带来压力,在弱网环境下,也会带来卡顿等不好的体验。
需求分析:
有没有一种方法,能够缓存首次成功的数据访问,然后定个有效期,在这个有效期内,如果还有同一网络请求,则直接从缓存中获取返回值。这样,可以在这个有效期内,减小访问服务器的次数。当用户量大的情况下,可以给服务器明显减负。
解决方案:
经过查找,还真找到一个有效的方案来解决上述问题。
public class NetworkInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
int maxAge = 60; //有效期
return response.newBuilder()
.removeHeader("Pragma")
.removeHeader("Cache-Control")
.header("Cache-Control", "public, max-age=" + maxAge)
.build();
}
}使用方法:
private void testOnlyRequest() throws Exception{
File cacheFile = new File(this.getApplication().getCacheDir(), "caheData");
//设置缓存大小
Cache cache = new Cache(cacheFile, 1024*1024*14);
final OkHttpClient client = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.connectTimeout(15,TimeUnit.SECONDS)
.addNetworkInterceptor(new NetworkInterceptor())
.cache(cache)
.build();
new Thread(new Runnable() {
@Override
public void run() {
Retrofit retrofit= new Retrofit.Builder()
.baseUrl("http://fy.iciba.com/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);
Call<Translation1> call= request.getCall_1();
Translation1 translation1 = null;
try {
translation1 = call.execute().body();
translation1.show();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}补全下代码:
public interface GetRequest_Interface {
// 网络请求1
@GET("ajax.php?a=fy&f=en&t=zh&w=welcome")
Call<Translation1> getCall_1();
}public class Translation1 {
private int status;
private content content;
private static class content {
private String ph_en;
private String ph_am;
private String ph_en_mp3;
private String ph_am_mp3;
private String ph_tts_mp3;
private String[] word_mean;
}
//定义 输出返回数据 的方法
public void show() {
Log.d("RxJava", "翻译内容 = " + content.word_mean[0]);
}
public void show(Context context){
Toast.makeText(context,"翻译内容 = " + content.word_mean[0], Toast.LENGTH_SHORT).show();
}
}怎么调用就不讲了。代码是最好的老师
不积跬步,无以至千里。

浙公网安备 33010602011771号