在将网页加载到 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,然后代码准备好获取信息并检查它。
这是想要的进程:
- 用户打开新页面
- 自动进入
shouldOverrideUrlLoading
,然后进入 if
语句(JSON 尚未解析)
- 在
OnResponse
中获得 JSON 响应
- 返回
shouldOverrideUrlLoading
并输入 else
语句(JSON 已解析)
如你所见,每个进程都应该经过if
和else
语句,解析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:
You load a URL like:
loadUrl("http://www.google.com");
The browser redirects the user automatically via an HTTP Redirect.
这可能使我的代码无法实现。
在这一行中:webView.loadUrl(loadingURL);
,我正在发出一个不是由用户在 WebView 中发出的 https 请求,这就是它不调用 shouldoverrideurlloading
.
的原因
我需要解析 JSON WebView 中每个页面的内容,然后再显示给用户。
为此,我需要解析 JSON 元素,然后才能使用 shouldOverrideUrlLoading
方法。在解析 JSON 对象之前我不能使用它,因为我依赖该元素作为我实现该方法的一部分。
我创建了一个名为 jsonParsed
的变量来指示我是否从 JSON 对象中获得了所有需要的信息。
一开始初始化为false。
当我从服务器收到响应时,我知道对象已被解析,所以我在 onLoaded
方法中将变量更改为 true,然后代码准备好获取信息并检查它。
这是想要的进程:
- 用户打开新页面
- 自动进入
shouldOverrideUrlLoading
,然后进入if
语句(JSON 尚未解析) - 在
OnResponse
中获得 JSON 响应 - 返回
shouldOverrideUrlLoading
并输入else
语句(JSON 已解析)
如你所见,每个进程都应该经过if
和else
语句,解析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:
You load a URL like: loadUrl("http://www.google.com");
The browser redirects the user automatically via an HTTP Redirect.
这可能使我的代码无法实现。
在这一行中:webView.loadUrl(loadingURL);
,我正在发出一个不是由用户在 WebView 中发出的 https 请求,这就是它不调用 shouldoverrideurlloading
.