是的,我知道该文档stopLoading()说:" 停止当前的负载. "
但是当我尝试使用它在加载新页面之前停止加载当前正在进行的页面时,它似乎没有按预期运行:
07-24 12:53:30.177: V/WebView.loadUrl: http://www.google.com
07-24 12:53:30.227: V/WebViewClient.onPageStarted: http://www.google.com
===> WebView.stopLoading() called here <====
07-24 12:53:31.917: V/WebView.loadUrl: http://www.stackoverflow.com
07-24 12:53:32.697: V/WebViewClient.onPageFinished: http://www.google.com
07-24 12:53:32.767: V/WebViewClient.onPageStarted: http://www.stackoverflow.com
07-24 12:53:33.587: V/WebViewClient.onPageFinished: http://www.stackoverflow.com
Run Code Online (Sandbox Code Playgroud)
正如您在日志中看到的那样,尽管事先大约1秒钟被调用,但是WebViewClient.onPageFinished()第一次loadUrl()被调用.WebView.stopLoading()
这是为什么?
是什么stopLoading()真的吗?
嗨
在列表视图中我有一个webview应该从服务器加载图像文件,当没有图像存在时,我需要一个虚拟图像.我试过
holder.image.setWebViewClient(new WebViewClient()
{
@Override
public void onReceivedError( WebView view, int errorCode, String description, String failingUrl)
{
System.out.println("description error" + description);
view.setVisibility( View.GONE );
}
@Override
public void onPageFinished(WebView view, String url) {
view.setVisibility( View.VISIBLE );
}
});
Run Code Online (Sandbox Code Playgroud)
我在FrameLayout中有一个虚拟图像的webview,在每个图像url加载后调用onPageFinished监听器,但是没有为产生404错误的url调用onReceivedError.任何猜测如何做.
我的问题与这一个人不同.我想在页面加载开始时我的进度对话框开始,在网页加载完成页面加载时结束.我的问题是进度对话框启动并永远不会dismissed.I已设置断点它表明进度对话框启动并获得驳回多次然后开始甚至后页面加载完成,不会被解雇.我的问题是为什么onPageStarted多次执行单页加载?为什么在完成页面加载后没有调用onPageFinished?
myWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
myWebView.loadUrl(url);
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(myWebView, url, favicon);
Log.d("mytag","Page Loading Started");
//myURLProgressDialog= ProgressDialog.show(WebviewExampleActivity.this, "Page Loading", "Wait for a moment...");
}
@Override
public void onPageFinished(WebView view, String url) {
Log.d("mytag","Page Loading Finished!");
super.onPageFinished(myWebView, url);
//myURLProgressDialog.dismiss();
}
});
Run Code Online (Sandbox Code Playgroud)
我自我标记的过滤日志就像这样加载单页:
10-06 10:32:49.298: DEBUG/mytag(508): Page Loading Started
10-06 10:32:49.998: DEBUG/mytag(508): Page Loading Started
10-06 10:32:50.048: DEBUG/mytag(508): Page Loading Finished!
10-06 10:32:50.048: DEBUG/mytag(508): …Run Code Online (Sandbox Code Playgroud) 我尝试捕获webview longclicks以显示上下文菜单.(请参阅下面的代码)当长按图像时,我总是将图像URL作为额外的(对于具有IMAGE_TYPE的未链接图像和具有SRC_IMAGE_ANCHOR_TYPE的链接图像).但是如何获得带有超链接的图像的链接URL(而不是图像URL)呢?
最好,塞巴斯蒂安
mywebview.setOnLongClickListener(new OnLongClickListener() {
public boolean onLongClick(View v) {
final WebView webview = (WebView) v;
final WebView.HitTestResult result = webview.getHitTestResult();
if (result.getType() == SRC_ANCHOR_TYPE) {
return true;
}
if (result.getType() == SRC_IMAGE_ANCHOR_TYPE) {
return true;
}
if (result.getType() == IMAGE_TYPE) {
return true;
}
return false;
}
});
Run Code Online (Sandbox Code Playgroud) 在某些网站上,我注意到如果我直接访问内页(即不是通过触摸同一网站上不同页面的链接),则onPageFinished()需要永久(即2分钟甚至更长时间!)到达.
如果我通过触摸同一网站上页面中的链接加载同一页面,则onPageFinished()始终在1-2秒内到达(相同的Internet连接,相同的条件).
在所有情况下,只有一个onPageStarted()而且只有一个onPageFinished().也就是说,不涉及重定向.
此外,在直接(慢)和从站内(快速)访问中,整个页面显示为完整(可视).只有onPageStarted()那些因某种原因拒绝到达(在直接访问中).
为了更好地理解这个问题,我提供了这样一个页面的例子:
例如,如果您从网站的主页访问此页面,则可以onPageFinished()更快地到达.
(主页本身,直接访问,onPageFinished()在1-2秒内得到!)
有什么可以解释这种行为?
如何解决这样的问题?
更新1:看看LogCat输出我注意到慢速(直接)情况的特点是dalvikvm GC操作突然出现之后 onPageStarted():
07-18 21:22:33.876: D/dalvikvm(6298): GC_FOR_MALLOC freed 10371 objects / 495744 bytes in 54ms
07-18 21:22:34.016: D/dalvikvm(6298): GC_FOR_MALLOC freed 808 objects / 50824 bytes in 51ms
07-18 21:22:34.586: D/dalvikvm(6298): GC_FOR_MALLOC freed 1092 objects / 297328 bytes in 72ms
07-18 21:22:34.646: D/dalvikvm(6298): GC_EXTERNAL_ALLOC freed 49 objects / 2296 bytes in 59ms
07-18 21:22:36.526: …Run Code Online (Sandbox Code Playgroud) 在我的WebView中,我在标题中有多个链接.在离线模式下,我不能允许重新加载页面并按原样保留该页面,然后通知用户有关互联网连接的信息.shouldOverrideUrlLoading如果我点击其他链接,我可以在加载之前捕获链接.但是,如果我单击相同的链接,shouldOverrideUrlLoading则不会被触发,而是onLoadResource首先调用方法.在那个方法我试过,webView.stopLoading();但它继续工作和火onReceivedError方法,并在页面上显示错误报告.
这是我的WebClient:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(MyApplication.getInstance().isOnline()) {
return false;
}
Toast.makeText(getApplicationContext(), "Please check Internet connection and try again.", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.i("ON_PAGE_START", "RUNNING ============>" + url);
if (MyApplication.getInstance().isOnline()) {
super.onPageStarted(view, url, favicon);
} else {
webView.stopLoading();
}
}
@Override
public void onLoadResource(WebView view, String url) {
if (MyApplication.getInstance().isOnline()) {
super.onLoadResource(view, url); …Run Code Online (Sandbox Code Playgroud) 如果我收听DownloadListener,我会在浏览器已经请求后获取我需要请求的URL .浏览器已经打开了与URL的连接(这就是它知道这是一个下载的方式),为什么它不能通过我的连接?
我还尝试为其分配一个自定义WebViewClient,WebView并shouldOverrideUrlLoading在请求之前使用它来捕获URL.要以这种方式下载文件,我在浏览器之前请求每个URL,然后通过它的Content-Type I决定是否下载它,如果是,那么我从已经打开的连接下载它,否则我关闭连接并指示浏览器加载它,浏览器......再次请求它.另外,shouldOverrideUrlLoading我不知道应该使用哪种方法和哪些cookie来请求给定的URL.
我怎么能不不必要的请求两次,仍然可以下载使用的WebView文件?
我面临一个奇怪的问题.
在我的应用程序中,我需要根据资源文件夹中的WebView中的单击按钮加载静态html文件.
现在在5个html文件中,一个html文件包含15个静态链接.这些链接需要在移动浏览器中将用户重定向到提到的URL.我target="_blank"在我的html文件中用于此目的如下.
<div class="lid"><a href="https://www.irctc.co.in/" target="_blank">Railway Reservation </a></div>
Run Code Online (Sandbox Code Playgroud)
现在,这在一个简单的示例应用程序中工作正常,WebView没有WebViewClient添加任何内容.
但我需要一个WebViewClient我的其他功能.那时候target="_blank"完全被忽略了.并且URL在WebView本身中打开.
我找到了一个解决方法,我可以使用shouldOverrideUrlLoading如下:
myWebView.setWebViewClient(new WebViewClient(){
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
if(url.equalsIgnoreCase("https://www.irctc.co.in/"))
{
view.getContext().startActivity(
new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
}
else
return super.shouldOverrideUrlLoading(view, url);
}
});
Run Code Online (Sandbox Code Playgroud)
所以这是在默认浏览器中打开该特定URL.
基本上我的问题是:
target="_blank"我们使用时为什么被忽略WebViewClient?这个问题还有其他解决方法吗?因为我有15个链接,我需要比较.我无法在新浏览器中加载所有网址,因为有一些链接需要在同一个WebView中打开.
我们的应用程序有选项卡,其中一个片段可以包含webview客户端.用户现在报告webviewclient无法加载页面的问题.我们已经确认服务器已启动并运行,我们还发现问题发生在v4.3和所有早期版本中.我们也确认它在v5.0中运行良好; 现在我们无法测试它是否在4.4中工作(我猜这些信息只有在知道4.4和更新版本中发生的更改会导致所有早期版本中的某些内容失败时才有用).
所以实际问题是我们创建了webviewclient并将其加载到片段中,在这个场景中,所有版本的网页(通过HTTPS连接)都会完美地加载.对于v5.0,我们可以单击另一个选项卡,然后返回到带有webviewclient的选项卡; 我们可以看到正在创建的片段,一切都按预期工作,网页按预期加载.但是对于v4.3及更早版本,我们看到正在创建片段,但webviewclient会使用-11错误代码触发onReceivedError(无法建立安全连接).在调试日志中进一步查看我们得到握手错误,这是调用的日志.有趣的是,我们连接的网站可以接受TLS1.2; 我们可以看到,当我们使用Firefox访问URL并使用开发工具等时,错误也非常有趣.
04-24 14:38:52.415: W/chromium(15434): external/chromium/net/http/http_stream_factory_impl_job.cc:865: [0424/143852:WARNING:http_stream_factory_impl_job.cc(865)] Falling back to SSLv3 because host is TLS intolerant:
04-24 14:38:52.446: V/chromium(15434): external/chromium/net/socket/ssl_client_socket_openssl.cc:310: [0424/143852:INFO:ssl_client_socket_openssl.cc(310)] ssl_ctx_ is used
04-24 14:38:52.469: E/chromium(15434): external/chromium/net/socket/ssl_client_socket_openssl.cc:899: [0424/143852:ERROR:ssl_client_socket_openssl.cc(899)] handshake failed; returned 0, SSL error code 5, net_error -107
04-24 14:38:52.469: V/chromium(15434): external/chromium/net/socket/ssl_client_socket_openssl.cc:508: [0424/143852:INFO:ssl_client_socket_openssl.cc(508)] ~SSLClientSocketOpenSSL()
04-24 14:38:52.469: I/GATE(15434): <GATE-M>DEV_ACTION_ERROR</GATE-M>
04-24 14:38:52.477: V/webkit(15434): reportError errorCode(-11) desc(Couldn't establish a secure connection.)
04-24 14:38:52.532: I/GATE(15434): <GATE-M>DEV_ACTION_COMPLETED</GATE-M>
Run Code Online (Sandbox Code Playgroud)
挖掘它看起来我们可能需要覆盖SSLProtocolFactory; 但这似乎是自签名证书等.我们正在连接到一个知名的第三方,他们的证书似乎没有任何问题.与往常一样,它可能感觉像我们早期版本的Android所缺少的东西; 或解决某些已在新版本中修复但未确定下一步要查看的内容.
当我调用WebView.loadUrl()时,如何禁用Android WebView/WebViewClient发送对favicon.ico的请求?我可以看到在通过CharlesProxy分析请求时进行的调用.
我不拥有我在WebView中显示的HTML内容.我的研究已经从服务器端找到了很多关于变通方法的结果,但这些对我来说不起作用.