天天看点

Android性能优化之网络优化

本文讲解如何通过缓存来实现网络优化。

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”);”