【问题标题】:Trying to parse JSON of a web page before it's loaded in a WebView尝试在将网页加载到 WebView 之前解析网页的 JSON
【发布时间】:2017-10-12 01:11:54
【问题描述】:

在向用户显示之前,我需要从 WebView 中的每个页面中解析 JSON 内容。

为此,我需要解析 JSON 元素,然后才能使用 shouldOverrideUrlLoading 方法。在解析 JSON 对象之前,我无法使用它,因为我依赖该元素作为该方法实现的一部分。


我创建了一个名为jsonParsed 的变量来指示我是否从JSON 对象中获得了所有需要的信息。 起初,它被初始化为假。
当我从服务器收到响应时,我知道对象已被解析,因此我在 onLoaded 方法中将变量更改为 true,然后代码已准备好获取信息并进行检查。


这是想要的过程:

  1. 用户打开新页面
  2. 自动输入shouldOverrideUrlLoading,然后输入if 语句(JSON 尚未解析)
  3. OnResponse 中获取 JSON 响应
  4. 回到shouldOverrideUrlLoading,输入else语句(解析JSON)

如您所见,每个进程都应该经过ifelse语句,解析JSON之前的if和解析之后的else


问题:

shouldOverrideUrlLoading 在每个步骤 1 中都会到达,但每次都会进入不同的语句。第一次进入if(步骤 2+3),下一次进入else(步骤 4),这个过程不断重复。 ..

我认为这条线 webView.loadUrl(loadingURL); 不调用 shouldOverrideUrlLoading 出于某种原因。


这是我的代码 sn-p:

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon)
    {
     super.onPageStarted(view, url, favicon);
     mProgressDialog.show();                        
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView wView, String url){
                                    loadingURL=url;
            if (!jsonParsed){
            /** JSON object is not parsed
            * Some code for adding request 
to requestQueue and than loading new url in onResponse method... */                          
            }

            else {                         
        /** JSON object is parsed, starting checking process
        * I need to check this URL and decide whether or not to override it*/                               
          jsonParsed=false;
          Root root = new Gson().fromJson(jsonResponse, Root.class);
          for (Page page : root.query.pages.values()) {
          firstParagraph=page.extract; //Parsing process, works fine
                                        }
          if (firstParagraph!=null) {
         //If the webView isn't Wikipedia's article, it will be null
         if (firstParagraph.contains(allowedContent)) {
        //Passing URL to view
         return true;
         }
    }
     return false; //The URL leads to unallowed content  
                                    }
                                }

    @Override
    public void onPageFinished(WebView view, String url) {
     CloseBlocksAndDisableEdit(view);
      mProgressDialog.dismiss();
                         }

    private final Response.Listener<String> onLoaded = new Response.Listener<String>() {
    @Override
        public void onResponse(String response) {
         jsonResponse=response; //Getting response
         jsonParsed=true; //Object was examined
         webView.loadUrl(loadingURL);
       }
    };

造成此问题的原因可能是什么?
如果这种方式不可能,我想知道哪种方式更好......

【问题讨论】:

  • 请更具体地说明您的问题。
  • 我已经编辑了我的问题并试图更具体。
  • 您在 webview 客户端中使用的任何语句都会循环...这意味着您必须使用 catch 机制来获取您想要的内容并结束循环。
  • 我真的不明白这里有什么循环。我已经编辑了我的问题,试图找到更具体的问题......

标签: android json parsing android-webview android-volley


【解决方案1】:

我找到了这个答案: https://stackoverflow.com/a/6739042/7483311

写在这个答案里:

经过一些研究,我得出结论,尽管大多数教程 外面说,shouldOverrideUrlLoading() 在以下情况下不会被调用:

  1. 您加载的 URL 如下: loadUrl("http://www.google.com");

  2. 浏览器通过 HTTP 重定向自动重定向用户。

这可能使我的代码不可能。 在这一行中:webView.loadUrl(loadingURL);,我正在发出一个不是用户在 WebView 中发出的 https 请求,这就是它不调用 shouldoverrideurlloading 的原因。

【讨论】:

    猜你喜欢
    • 2013-11-24
    • 2014-07-18
    • 1970-01-01
    • 2012-08-30
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多