最近两天一直在做一个网页连续测试的例子,循环统计各个页面的从向服务器发送数据------》服务器开始响应数据包---->服务器数据包响应完------->加载到手机 这三个时间段的统计!从而简单的统计网络加载页面的时间在哪些操作上消耗时间较多,为以后的改进做铺垫! 如果手机看不到数据,可以点击生成文件的按钮就可以在sd中看到txt 文件了. 注: 1.这只是个人理解做出来的demo,希望高手可以给点建议! 2.对android中内置的webkit 加载网页还不是很理解。有知者可以把具体过程告诉我。谢谢哈! 主要有两个类: public class TestRecordNetTimeActivity extends Activity { Button start, stop, report, getFile; WebView web_content; // String[] webs = { // "http://wap.wirelessfj.com.cn/changecity.do;cacheClear=0.6904324889739418?cityid=591", // "http://wap.szicity.com/index.php/xuan_news/", // "http://wap.10086.cn/index.jsp", "http://m.58.com/", // "http://sina.cn" }; // http://wap.mybj.gov.cn/ String[] webs = { "http://wap.wirelessfj.com.cn/", "http://wap.szicity.com/index.php/city_xuan/index/", "http://wap.10086.cn/index.jsp", "http://wap.mybj.gov.cn/wap/IndexAction/indexPreLogin.action", "http://3g.sina.com.cn/" }; int i = 0; Boolean flag = true; long end_timeMillions; RecordDAO record = null; private final static String PATH = "/sdcard/recordNet"; private final static String FILENAME = "/records.txt"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); start = (Button) findViewById(R.id.start_btn); stop = (Button) findViewById(R.id.stop_btn); web_content = (WebView) findViewById(R.id.web_content); web_content.clearCache(true); // web_content.getSettings().setCacheMode(); record = new RecordDAO(this); record.createDatabase(); report = (Button) findViewById(R.id.show_report); getFile = (Button) findViewById(R.id.get_file); /* * report.setOnClickListener(new OnClickListener() { * * @Override public void onClick(View v) { * * Intent intent = new Intent(TestRecordNetTimeActivity.this, * ShowItemActivity.class); startActivity(intent); * * } }); */ start.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { web_content.setWebViewClient(new webContent()); web_content.loadUrl(webs[(i) % (webs.length)]); } }); stop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Builder builder = new AlertDialog.Builder( TestRecordNetTimeActivity.this); builder.setMessage("确定停止统计?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { System.exit(0); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.show(); } }); getFile.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub List<RecordNetTime> records = record.findAllInfo(); if (records != null && records.size() > 0) { try { if (Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState())) { File path = new File(PATH); File f = new File(PATH + FILENAME); if (!path.exists()) { path.mkdirs(); } if (!f.exists()) { // 创建文件夹 f.createNewFile(); } OutputStreamWriter osw = new OutputStreamWriter( new FileOutputStream(f)); StringBuilder sb = new StringBuilder(); sb.append("_id ") .append("请求时间点 ") .append("请求网络时间段 ") .append("网络响应时间段 ") .append("加载到手机时间段 ") .append("加载的url ").append("\n"); for (RecordNetTime net : records) { sb.append(net.getId() + " ") .append(net.getRequest_time() + " ") .append(net.getRequest_duration() + " ") .append(net.getResponse_duration() + " ") .append(net.getLoad_duration() + " ") .append(net.getUrl() + " ") .append("\n"); } osw.write(sb.toString()); osw.close(); Toast.makeText(TestRecordNetTimeActivity.this, "文件生成完毕", 3000).show(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { Toast.makeText(TestRecordNetTimeActivity.this, "没有数据,请点击开始统计", 3000).show(); } } }); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); System.exit(0); } class webContent extends WebViewClient { int ij = 0; List<Long> lists = new ArrayList<Long>(); SharedPreferences sp = TestRecordNetTimeActivity.this .getSharedPreferences("recordTime", 0); @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Editor edit = sp.edit(); long request_time = System.currentTimeMillis(); edit.putLong("request" + ij, request_time); edit.putString("request_time", FormateTimeUtil.fomateTime(request_time)); edit.commit(); System.out.println("ij的值是。。。。" + ij); ij++; System.out.println("我记得是那次的pageStar000t数据呢:" + sp.getLong("request0", 0l)); System.out.println("开始请求时间 " + request_time + "url " + url); } @Override public void onLoadResource(WebView view, String url) { // TODO Auto-generated method stub super.onLoadResource(view, url); System.out.println("服务端响应求请求时间是:" + System.currentTimeMillis() + " url :" + url); lists.add(System.currentTimeMillis()); } @Override public void onPageFinished(WebView view, String url) { System.out.println("页面加载结束" + System.currentTimeMillis() + "url:" + url); sp = getSharedPreferences("recordTime", 0); long request1 = sp.getLong("request0", 0l); String request_time = sp.getString("request_time", ""); if (lists != null && lists.size() > 0) { System.out.println("服务器响应时间开始" + lists.get(0)); System.out.println("服务器响应时间结束" + lists.get(lists.size() - 1)); long response_duration = lists.get(lists.size() - 1) - lists.get(0); System.out.println(lists.get(0) + " - " + request1 + " = " + (lists.get(0) - request1)); RecordNetTime recordTime = new RecordNetTime(); recordTime.setRequest_time(request_time); recordTime.setRequest_duration(lists.get(0) - request1); recordTime.setResponse_duration(response_duration); recordTime.setLoad_duration(System.currentTimeMillis() - lists.get(lists.size() - 1)); recordTime.setUrl(webs[(i) % (webs.length)]); record.insertRecord(recordTime); } sp.edit().commit(); lists.removeAll(lists); lists.clear(); // 依次循环进行 try { System.out.println("停留2秒再打开新页面。。。。。。。。。。。。。。"); Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } i++; ij = 0; // web_content.setWebViewClient(new webContent()); web_content.clearCache(true); web_content.loadUrl(webs[(i) % (webs.length)]); } } 。。。。。。。。。。。。。sqlite3数据库建立 public class RecordDAO extends BaseDAO { public RecordDAO(Context ctxt) { super(ctxt); } // 添加一条记录 public long insertRecord(RecordNetTime record) { long count = 0; ContentValues cv = new ContentValues(); cv.put("request_time", record.getRequest_time()); cv.put("request_duration", record.getRequest_duration()); cv.put("response_duration", record.getResponse_duration()); cv.put("load_duration", record.getLoad_duration()); cv.put("url", record.getUrl()); count = super.sd.insert// 返回的是当前记录的编号 ("statistics", null, cv); return count; } public List<RecordNetTime> findAllInfo() { List<RecordNetTime> records = null; Cursor recordCursor = super.sd.query("statistics", new String[] { "_id", "request_time", "request_duration", "response_duration", "load_duration", "url" }, null, null, null, null, null); int recordCount = recordCursor.getCount(); if (recordCount != 0 && recordCursor.moveToFirst()) { records = new ArrayList<RecordNetTime>(); for (int i = 0; i < recordCount; i++) { RecordNetTime recordTime = new RecordNetTime(); recordTime.setId(recordCursor.getInt(0)); recordTime.setRequest_time(recordCursor.getString(1)); recordTime.setRequest_duration(recordCursor.getLong(2)); recordTime.setResponse_duration(recordCursor.getLong(3)); recordTime.setLoad_duration(recordCursor.getLong(4)); recordTime.setUrl(recordCursor.getString(5)); records.add(recordTime); recordCursor.moveToNext(); } } else { return null; } recordCursor.close(); return records; } } 。。。。。。。。。。。base类 public class BaseDAO { Context ctxt = null; // 当前创建Sqlite3 数据库 SQLiteDatabase sd = null; int versionDatabase = 1; // 建库 class MyDataHelper extends SQLiteOpenHelper { String sql = "create table statistics (_id integer primary key autoincrement,request_time text not null, " + "request_duration text not null,response_duration text not null,load_duration text not null," + "url text not null);"; public MyDataHelper(Context context, String name,// 数据库物理文件的名字 // usernewer.db CursorFactory factory, int version) {// version:是否要修改物理数据库中表的结构 super(context, name, factory, version); // TODO Auto-generated constructor stub } // 执行Create table语句建立物理数据库 // 文件中保存的表. @Override public void onCreate(SQLiteDatabase db) { db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, // 1 int newVersion) { // 2 // 因为表结构发生改变 // 删表 db.execSQL("drop table if exists statistics"); db.execSQL(sql); // 重建表 onCreate(db); } } public BaseDAO(Context ctxt) { this.ctxt = ctxt; } // public Connection getConnection() public void createDatabase() { MyDataHelper myDataHelper = new MyDataHelper(this.ctxt, "record.db", null, 2);// -->onCreate() // 1-->2 -->onUpgrade()-->升级 try { // Sqlite3数据库正常 // 存储空间容量还有多 // 允许应用程序向数据库中添加数据 sd = myDataHelper.getWritableDatabase(); } catch (Exception e) { e.printStackTrace(); // 允许应用程序读取数据库中数据, // 但不允许进行修改和添加 sd = myDataHelper.getReadableDatabase(); } } // public void closeConnection() public void close() { if (sd != null) { sd.close(); sd = null; } } }