Попытка проанализировать JSON веб-страницы перед ее загрузкой в WebView
Мне нужно проанализировать содержимое JSON из каждой страницы в моем WebView, прежде чем оно будет показано пользователю.
Для этого мне нужно разобрать элемент JSON, и только тогда я смогу использовать метод shouldOverrideUrlLoading
. Я не могу использовать его до того, как я проанализировал объект JSON, потому что я полагаюсь на этот элемент как часть моей реализации этого метода.
Я создал переменную с именем jsonParsed
, чтобы указать, есть ли у меня вся необходимая информация из объекта JSON.
Во-первых, это так инициализируется как false.
Когда я получаю ответ от сервера, я знаю, что объект был проанализирован, поэтому я изменяю переменную на true в методе onLoaded
, и тогда код готов получить информацию и проверить ее.
Это искомый процесс:
- открытие новой страницы пользователем
- автоматический ввод в
shouldOverrideUrlLoading
, а затем в операторif
(JSON еще не был проанализирован) - получение ответа JSON в
OnResponse
- возвращаясь к
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 ответ:
Я нашел этот ответ.: https://stackoverflow.com/a/6739042/7483311
Написано в этом ответе:
После некоторых исследований я прихожу к выводу, что несмотря на то, что большинство учебников там говорят, shouldOverrideUrlLoading() не вызывается, когда:
Вы загружаете URL-адрес, как: loadUrl ("http://www.google.com");
Браузер автоматически перенаправляет пользователя через HTTP-перенаправление.
Это, вероятно, делает мой код imppossible. В этой строке:
webView.loadUrl(loadingURL);
, я делаю запрос https, который не был сделан пользователем в WebView, и именно поэтому он не вызываетshouldoverrideurlloading
.