Попытка проанализировать JSON веб-страницы перед ее загрузкой в WebView


Мне нужно проанализировать содержимое JSON из каждой страницы в моем WebView, прежде чем оно будет показано пользователю.

Для этого мне нужно разобрать элемент JSON, и только тогда я смогу использовать метод shouldOverrideUrlLoading. Я не могу использовать его до того, как я проанализировал объект JSON, потому что я полагаюсь на этот элемент как часть моей реализации этого метода.


Я создал переменную с именем jsonParsed, чтобы указать, есть ли у меня вся необходимая информация из объекта JSON. Во-первых, это так инициализируется как false.
Когда я получаю ответ от сервера, я знаю, что объект был проанализирован, поэтому я изменяю переменную на true в методе onLoaded, и тогда код готов получить информацию и проверить ее.


Это искомый процесс:

  1. открытие новой страницы пользователем
  2. автоматический ввод в shouldOverrideUrlLoading, а затем в оператор if (JSON еще не был проанализирован)
  3. получение ответа JSON в OnResponse
  4. возвращаясь к shouldOverrideUrlLoading и вводим оператор else (JSON анализируется)
Как вы можете видеть, каждый процесс должен пройти через оба оператора if и else, if до того, как был проанализирован JSON, и else после того, как он был проанализирован.

Задача:

shouldOverrideUrlLoading достигается каждый Шаг 1 , но каждый раз он переходит в другое утверждение. Первый раз заходит в if (шаги 2+3), и следующий идет в дом.else ( Шаг 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);
       }
    };

Что может быть причиной этой проблемы?
Если это невозможно таким образом, я хотел бы знать, какой путь лучше...

1 2

1 ответ:

Я нашел этот ответ.: https://stackoverflow.com/a/6739042/7483311

Написано в этом ответе:

После некоторых исследований я прихожу к выводу, что несмотря на то, что большинство учебников там говорят, shouldOverrideUrlLoading() не вызывается, когда:

  1. Вы загружаете URL-адрес, как: loadUrl ("http://www.google.com");

  2. Браузер автоматически перенаправляет пользователя через HTTP-перенаправление.

Это, вероятно, делает мой код imppossible. В этой строке: webView.loadUrl(loadingURL);, я делаю запрос https, который не был сделан пользователем в WebView, и именно поэтому он не вызывает shouldoverrideurlloading.