手记

android(网络)使用webView加载出现找不到网页的问题

写在前面:

       加入APK BUS这么久了,今天更新android bus中的第一条帖子 ,以后APK bus作为个人的技术博客 ,技术博客只说干货,既然作为以后主要使用的干货论坛,那么自然很看到这个论坛的。当然第一次来也知道在这里面很多藏龙卧虎的高手,他们是我学习的榜样,是我前进动力,当然也是需要超越的人。但现在我什么都不是,所以需要低调向他们致敬并学习之。至于其他内容希望大家可以关注我的网易博客http://www.bgwan.blog.163.com 或者关注一下个人新浪微博 nawgb ,欢迎喜欢android开发或者IOS开发的朋友们交流学习一起成长 。

   第一条帖子如上标题:android(网络)使用webView加载出现找不到网页的问题。也是刚刚遇到的问题,这么一说就暴露了自己的水平了,但没有关系,正题哈,你来到这儿要么是出现了这样的问题,要么就是捧场的 。不管是什么,都会完美帮你解决。如果有更好的解决方案也希望大家一起分享 ,评论 。

1.开始的时候我使用的是webView.loadUrl(uri);当然setWebViewClient();方法包裹住;

   webView.setWebViewClient(new WebViewClient() {
   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
    // TODO Auto-generated method stub
    return true;
   }
  });

服务器端的数据大概长这个样子:(JSON数据)(当然还有一部分HTML 的数据),因为代码耦合度实在太高了,不然我贴完整个代码估计这一页网页都装不下。

content:[{name:软件工程概述,uri:\"http://baike.baidu.com/link?url=aXfC_4b7E6ZXnNjp_kGlhp-8YT1IyVUoVTxVKAEcK5ZXvjqWaFhm72-HTMPb_1QXhPdprqdzLfOTm_OkhrHzxb0NIHHVrnmIcPFqFtzplf7\"},{name:需求分析,uri:\"http://baike.baidu.com/link?url=Fc-zA3rWewRySdp8SGpL6gRAK0os68xwes0GsKnM9XXLpH4FLSqT8XDcgN3qG6BZUYObSqQzgEG27HMUDek_V_\"}]},"

在使用了webView.loadUrl();后出现找不到网页,于是webView这么多方法我就都试了试,在使用webView.loadData(data, "text/html", "utf-8"),出现依然找不到网页的问题

分析一下,解决方案入下:

1)如果你大意还可能忘记上网权限了,或者是没有联网。

2)那么我最后是webView.loadData 改为 webView.loadDataWithBaseURL 方法就可以了。

2.下面分析一下原因:

         loadData()中的html data中不能包含'#', '%', '\', '?'四中特殊字符,出现这种字符就会出现解析错误,      显示找不到网页还有部分html代码。因为css中经常用'#', '%'等字符,所以大部分网页会出现解析错误,需要如何处理呢?我们需要用UrlEncoder编码为%23, %25, %27, %3f 。

      webView.loadData(URLEncoder.encode(data, "utf-8"), "text/html",  "utf-8");

这样写之后会发现错误没有了,但是显示效果不好,一些背景颜色排版效果都没有了,我们看一下WebView 类下面的源代码就会发现问题:

WebView.class 源码:   

public void loadDataWithBaseURL(String baseUrl, String data,
            String mimeType, String encoding, String failUrl) {
    }

1)推荐使用:loadDataWithBaseURL()方法。完美解析HTML代码。

3.那么对于以上json数据显示的地址可能用我的第一种方法没有显示出来的方法分析一下 。

   webView.setWebViewClient(new WebViewClient() {
   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
    // TODO Auto-generated method stub
    return true;
   }
  });

解析:

webview加入的网络请求的加载框,所以得在加入网络加载框 。

1)解决方案:我的第二种请求的uri中是设置了,webVieClient,当然我不知道是不是没有让他结束掉导致没有显示出网页 。

//设置webview的客户端,
         webView.setWebViewClient(new WebViewClient()
        {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon)
            {
                //                super.onPageStarted(view, url, favicon);
                netDialog = DialogUtil.showNetProgressDialog(AdvartWebActivity.this);
                super.onPageStarted(view, url, favicon);
            }
            
            @Override
            public void onPageFinished(WebView view, String url)
            {
                if (null != netDialog)
                {
                    //加载完成,dialog销毁
                    netDialog.dismiss();
                }
                super.onPageFinished(view, url);
            }
        });

2)在此之前加入了webview加载url的四个属性 
        webView.getSettings().setBuiltInZoomControls(false);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setRenderPriority(RenderPriority.HIGH);
        webView.getSettings().setBlockNetworkImage(true);

最后,其实我的项目在上面第一条解决方案就已经出现结果,当然写了这么多,也是希望以后大家有个参考,第一次来bus发帖写的不好,希望大家体谅 。

原文链接:http://www.apkbus.com/blog-671730-59431.html

0人推荐
随时随地看视频
慕课网APP