Android Webview中postUrl与loadUrl加载页面的示例

  介绍

这篇文章主要介绍Android Webview中postUrl与loadUrl加载页面的示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

Android是什么

Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国谷歌公司和开放手机联盟领导及开发。

本文要介绍的主要是在项目过程中使用Webview的postUrl遇到的坑。

<强> 1,使用场景如下:

Webview在加载H5链接时,默认是使用loadUrl进行加载,如果你设置了缓存属性(进行缓存),在显示的H5页面内点击跳转到另外一个页面后,按回退键,可以正常的返回到上一个页面,因为进行了缓存设置。但是如果使用postUrl进行加载,即使你设置的缓存属性是进行设置,当你调转到另外一个页面后,按回退键,不会缓存之前的页面,而是重新调用postUrl进行加载。这时问题就来了,同样是进行加载,第一次的postUrl能够正常加载,重新加载会加载失败,没有内容显示。是不是很有意思,为什么会出现这样的情况呢,通过抓包发现,虽然加载的是同样一个链接,但是重新加载的请求属性为空,导致加载失败。

<强> 2,如何解决:

既然找到了原因,请求属性为空,肯定是有解决办法的,那就手动设置请求属性,重新加载。如何手动设置,首先你肯定是要能够拿到请求的所有内容和参数。用过Webview的人相必都很熟悉它的setWebViewClient方法。该方法内部有shouldInterceptRequest方法能够拿到请求的所有内容。不多说了,先上代码。

public  WebResourceResponse  shouldInterceptRequest (WebView 看来,,WebResourceRequest 请求),{   如果才能(Build.VERSION.SDK_INT 祝辞=,21){   ,,如果(! request.getMethod () .equalsIgnoreCase (“post")) {   ,,,return  super.shouldInterceptRequest(视图,请求);   ,,}   ,,}   DataOutputStream 才能;os =,空;   try {才能   ,,URL  mUrl =, new  URL(网址);   ,,HttpURLConnection  connection =, (HttpURLConnection), mUrl.openConnection ();   ,,connection.setDoInput(真正的);   ,,connection.setDoOutput(真正的);   ,,connection.setUseCaches(假);   ,,connection.setRequestMethod (“POST");   ,,如果(Build.VERSION.SDK_INT 祝辞=,21){   ,,,Iterator  headerKeys=request.getRequestHeaders () .keySet () .iterator ();   ,,,,(headerKeys.hasNext ()) {   ,,,,String 关键=headerKeys.next ();   ,,,,connection.setRequestProperty(键,request.getRequestHeaders () . get(关键));   ,,,}   ,,}   ,,connection.setRequestProperty (“content-type",“应用程序/x-www-form-urlencoded");   ,,os =, new  DataOutputStream (connection.getOutputStream ());   ,   ,,os.write (EncodingUtils.getBytes (postData,“BASE64"));   ,,os.flush ();   ,,return  new  WebResourceResponse(“文本/html",, connection.getContentEncoding (),, connection.getInputStream ());   ,,},catch  (Exception  e), {   ,,e.printStackTrace ();   }finally {才能   ,,如果(os !=null) {   ,,,try  {   ,,,,os.close ();   ,,,},catch  (IOException  e), {   ,,,,e.printStackTrace ();   ,,,}   ,,}   ,,}   return 才能super.shouldInterceptRequest(视图,请求);   ,}   });      webView.postUrl (url, EncodingUtils.getBytes (postData,“BASE64"));

该方法有个缺陷,只在Android 5.0.0以上的Api才有,5.0.0以下的Api是没有此方法的,这也是一个坑,不能兼容所有机型。通过该方法中的setRequestProperty方法重新设置了请求属性,然后使用postUrl进行重新加载,可以解决按回退键后页面的重新恢复。注意,由于帖子加载是不能缓存的,因此在设置缓存属性时一定要设置成重新加载属性。

<强> 3,解决后出现的问题:

问题看似解决了,但是此方法会有坑。如果你仔细研究该方法,你会发现shouldInterceptRequest方法是在整个加载过中都调用了的。如果你进行抓包,你会发现,从开始加载链接到H5页面中加载的每一个请求,该方法都会被调用,简单的说就是有多少个请求,该方法就会调用多少次。如果你的页面中还有一次帖子请求,那么问题就来了,你需要将第二次帖子请求的请求内容与第一次的进行对比,对比后选择到底是加载第一次的页面,还是加载第二次的页面,否则就会默认加载第一次的帖子页面。

<强> 4,结论

webview的H5页面加载最好使用loadUrl方式,如果使用postUrl方式进行加载,你需要重写整个setWebViewClient方法,当中会出很多坑,不建议这样做。

Android Webview中postUrl与loadUrl加载页面的示例