`

android webview WebViewClient

阅读更多
最近两天一直在做一个网页连续测试的例子,循环统计各个页面的从向服务器发送数据------》服务器开始响应数据包---->服务器数据包响应完------->加载到手机  这三个时间段的统计!从而简单的统计网络加载页面的时间在哪些操作上消耗时间较多,为以后的改进做铺垫!
如果手机看不到数据,可以点击生成文件的按钮就可以在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;
		}
	}
}
分享到:
评论

相关推荐

    Android WebView 去除标题

    webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); view.removeTitle(); } }); ``` 通过这种方式,我们...

    android WebViewClient与WebChromeClient用法

    总结来说,WebViewClient和WebChromeClient在Android WebView的使用中扮演着不可或缺的角色。理解它们各自的职责和用法,有助于我们更好地控制网页的加载过程,实现与网页内容的交互,从而提升应用的整体质量。

    Android webview调用摄像头扫描二维码

    本文将详细讲解如何在Android Webview中调用摄像头进行二维码扫描,并结合ZXing(Zebra Crossing)解析包进行二维码的解析。 首先,让我们了解Android Webview的基本用法。Webview是Android SDK提供的一种视图组件...

    WebView设置WebViewClient的方法

    WebView设置WebViewClient的方法 WebViewClient是WebView组件的一个回调接口,用于处理WebView中的各种事件,例如页面加载、链接点击、资源加载等。通过设置WebViewClient,我们可以在WebView中实现更加灵活的控制...

    Android webview加载网页.zip

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容,无需跳转到外部浏览器。这个“Android webview加载网页.zip”文件可能包含了一个示例项目或者教程,帮助开发者理解...

    Android Webview滑动监听

    在Android开发中,Webview是一个非常重要的组件,它允许开发者在原生应用中嵌入网页内容,实现网页与原生应用的交互。本篇将详细讲解如何在Android Webview中实现滑动监听以及图片的放大缩小功能。 首先,我们要...

    通过css注入实现android webview的夜间模式

    webview.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); webview.evaluateJavascript(nightModeCss, new ...

    Android WebView播放视频(包括全屏播放)

    在Android应用开发中,WebView是一个非常重要的组件,它允许开发者在应用程序内嵌入网页内容,实现类似浏览器的功能。本文将详细讲解如何在Android的WebView中播放视频,包括全屏播放的实现方法。以下是对该主题的...

    Android WebView加载网页以及本地图片缓存问题

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容,而无需离开应用。WebView不仅能够加载远程HTTP/HTTPS网址,还能处理本地HTML、CSS和JavaScript资源,极大地增强了应用...

    android webview 因iframe+target=“_blank “ 导致的页面无法正常打开或获取不到调整url

    在Android开发中,WebView是一个非常重要的组件,它允许我们在原生应用中内嵌网页内容,实现混合开发。然而,开发者时常会遇到一些棘手的问题,其中之一便是“android webview 因iframe+target=“_blank”导致的...

    android webview调用系统相机和图库

    在三星GT-I9300I(android 4.3 在这款手机上测试的时候,拍照后有的时候在webview上显示不出来,不知道是不是重写了 mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean ...

    Android WebView cache 缓存 在线 视频播放

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容。而WebView的缓存机制则是提高用户体验、减少网络流量的关键技术之一。本文将详细讲解如何利用WebView实现在线视频播放...

    Android webview QQ一键登录并向后台返回参数

    - 初始化WebView,设置WebViewClient和WebChromeClient,以便处理页面加载和JavaScript交互。 2. **QQ登录接口** - 要实现QQ登录,你需要在腾讯开放平台上注册应用,获取AppID和AppKey。然后,在WebView中加载QQ...

    android Webview(H5)中调用相册和拍照

    `WebView`是Android SDK中的一个类,它可以加载URL,展示HTML页面,并通过`WebViewClient`和`WebChromeClient`两个接口与JavaScript进行通信。在创建`WebView`时,通常需要设置`WebSettings`,例如开启JavaScript...

    Android下WebView中调用系统相机拍照范例

    在Android开发中,WebView是一个非常重要的组件,它可以加载和显示HTML内容,实现Web与原生应用的交互。...通过这样的方式,你可以在Android应用的WebView中无缝集成系统相机功能,为用户提供更丰富的体验。

    Android webview打开相册选择图片并上传到服务器,(亲测可用)

    在Android应用开发中,WebView是一个非常重要的组件,它允许开发者在应用内展示网页内容,甚至与网页进行交互。本文将详细讲解如何在Android的WebView中实现打开本地相册选择图片,并将其上传到服务器的功能。 首先...

    android webView加载html 并引用本地资源(图片、字体库)

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页内容。这篇教程将详细介绍如何在WebView中加载HTML,并引用本地的资源,如图片和字体库。 首先,让我们理解WebView的基本用法。在...

    详解android 用webview加载网页(https和http)

    Android WebView 加载网页是移动应用开发中的一项基本需求。然而,在加载 HTTPS 和 HTTP 网页时,WebView 可能会出现一些问题,本文将详细介绍这两个错误的解决方法。 错误一:加载 HTTPS 请求的网页时,WebView ...

    android webview 拨打电话

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页内容。当我们需要在WebView中实现拨打电话的功能时,需要理解Android权限管理、WebView加载本地HTML以及JavaScript与Android原生代码...

Global site tag (gtag.js) - Google Analytics