在将网页加载到 WebView 之前尝试解析网页的 JSON

Trying to parse JSON of a web page before it's loaded in a WebView

我需要解析 JSON WebView 中每个页面的内容,然后再显示给用户。

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


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


这是想要的进程:

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

如你所见,每个进程都应该经过ifelse语句,解析JSON之前的if,以及[=19] =] 解析后。


问题:

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

我认为这一行 webView.loadUrl(loadingURL); 出于某种原因没有调用 shouldOverrideUrlLoading


这是我的代码片段:

    @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);
       }
    };

导致此问题的原因是什么?
如果这种方式不行,我想知道哪种方式更好...

我找到了这个答案:

这个回答里写的:

After some research I conclude that despite what most of the tutorials out there say, shouldOverrideUrlLoading() does not get called when:

  1. You load a URL like: loadUrl("http://www.google.com");

  2. The browser redirects the user automatically via an HTTP Redirect.

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

的原因