本文讲解如何通过缓存来实现网络优化。
Demo:
MainActivity:
package com.dn.networkcache;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.graphics.BitmapFactory;
import android.net.http.HttpResponseCache;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends Activity {
protected static final String TAG = "ricky";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void openCache(View v){
try {
//Android系统默认的HttpResponseCache(网络请求响应缓存)是关闭的
//这样开启,开启缓存之后会在cache目录下面创建http的文件夹,HttpResponseCache会缓存所有的返回信息(以文件地方式存储在缓存目录下)
File cacheDir = new File(getCacheDir(), "http");//缓存目录
long maxSize = 10*1024*1024;//缓存大小,单位byte
HttpResponseCache.install(cacheDir, maxSize );
Log.d(TAG, "打开缓存");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void request(View v){
Log.d(TAG, "~~~~~~~~~~~~~");
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpURLConnection conn = (HttpURLConnection) new URL("http://192.168.52.1:8080/test/MyServlet").openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
int responseCode = conn.getResponseCode();
if(responseCode==200){
InputStream is = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
Log.d(TAG, br.readLine());
}else{
Log.d(TAG, responseCode+"");
}
} catch (Exception e) {
e.printStackTrace();
Log.d(TAG, "请求翻车了!!");
}
}
}).start();
}
public void request2(View v){
new Thread(new Runnable() {
@Override
public void run() {
try {
BitmapFactory.decodeStream((InputStream) new URL("http://192.168.52.1:8080/test/icon.png").getContent());
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
public void deleteCache(View v){
HttpResponseCache cache = HttpResponseCache.getInstalled();
if(cache!=null){
try {
cache.delete();
Log.d(TAG, "清空缓存");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务器源码:传输了简单的json数据,并设置了服务器请求的时间。
package com.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//给客户端响应一个json字符串
PrintWriter writer = response.getWriter();
Gson gson = new Gson();
JsonObject json = new JsonObject();
json.addProperty("isValid", true);
json.addProperty("description", "information");
writer.write(gson.toJson(json));
//标识五秒之内不会再请求服务器
response.addHeader("Cache-control", "max-age=5");
System.out.println("响应时间:"+System.currentTimeMillis());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
通常,文件缓存有一个有效期,App在有效期内请求文件,由设备缓存提供文件。如果缓存过期,则连接服务器,检查文件是否被修改。如果文件相同,则向设备发送一个HTTP304"not modified"响应,并重置缓存定时器;如果文件不同,则下载新文件。缓存定时器地长度取决于缓存内容及其改动地频率(例如,运动队标志这些很少改动地可以缓存一年,天气情况缓存5分钟,头条新闻订阅源可能不缓存)。更改内容地缓存时间不仅确保用户看到地数据始终是最新地,还能限制重复下载地文件地数量,从而节省电量和流量。一般在服务器端通过报头设置内容地过期日期——“response.addHeader(“Cache-control”, “max-age=5”);”