Android WebView无法加载URL问题求助(附代码及运行日志)
解决WebView无法加载课程内容的问题
你好!很高兴你已经搞定了Activity启动的问题,不过WebView加载内容的bug咱们来一步步排查解决。先看看你贴出来的代码和运行日志:
你的当前代码
Argomento.java
import android.app.ProgressDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; public class Argomento extends AppCompatActivity { private ProgressDialog progDailog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_argomento); String nomeDispensa = getIntent().getStringExtra("dispensa"); progDailog = ProgressDialog.show(this, "Loading","Please wait...", true); progDailog.setCancelable(false); WebView documentOpener = findViewById(R.id.documentOpener); WebSettings webSettings = documentOpener.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setLoadWithOverviewMode(true); webSettings.setUseWideViewPort(true); documentOpener.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { progDailog.show(); view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, final String url) { progDailog.dismiss(); } }); documentOpener.loadUrl(nomeDispensa); } }
activity_argomento.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.fabio.myschoolsyllabus.Argomento"> <WebView android:id="@+id/documentOpener" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.constraint.ConstraintLayout>
第一步:检查最容易忽略的权限
首先确认你的AndroidManifest.xml里有没有添加网络权限——WebView加载网页必须要有这个权限,没有的话直接连不上网络,这是最常见的坑:
<uses-permission android:name="android.permission.INTERNET" />
第二步:验证传入的URL是否有效
你通过getIntent().getStringExtra("dispensa")获取加载地址,一定要确认这个字符串是完整有效的URL:
- 如果是网页,必须以
http://或https://开头,不能只写www.example.com - 如果是本地文件,要以
file://开头(比如file:///android_asset/your_file.html)
可以在加载前加一句日志,看看实际拿到的URL是什么:
Log.d("ArgomentoDebug", "要加载的URL: " + nomeDispensa);
如果URL格式不对,WebView根本不知道怎么加载内容。
第三步:优化WebView的代码逻辑
你的WebView代码有几个可以调整的地方,既能避免加载异常,还能帮你排查问题:
1. 升级WebViewClient的方法
你用的shouldOverrideUrlLoading(WebView view, String url)已经过时了,换成适配高版本Android的重载方法,同时优化加载状态的处理:
documentOpener.setWebViewClient(new WebViewClient(){ // 适配Android 7.0+的URL跳转处理 @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { view.loadUrl(request.getUrl().toString()); return true; } // 页面开始加载时显示进度框 @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); if (!progDailog.isShowing()) { progDailog.show(); } } // 页面加载完成后隐藏进度框 @Override public void onPageFinished(WebView view, final String url) { if (progDailog.isShowing()) { progDailog.dismiss(); } } // 捕获加载错误,直接提示问题 @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { super.onReceivedError(view, request, error); progDailog.dismiss(); Toast.makeText(Argomento.this, "加载失败: " + error.getDescription(), Toast.LENGTH_SHORT).show(); } });
这样不仅能更好地处理页面加载状态,还能在加载失败时直接看到错误信息,方便定位问题。
2. 避免ProgressDialog内存泄漏
记得在Activity销毁时关闭ProgressDialog,防止内存泄漏:
@Override protected void onDestroy() { super.onDestroy(); if (progDailog != null && progDailog.isShowing()) { progDailog.dismiss(); } }
第四步:分析日志里的关键点
看你提供的运行日志,大部分警告不影响WebView加载:
W/ResourceType: For resource 0x7f0a0030...:资源文件引用警告,暂时不影响WebView,后续可以排查布局或资源文件。E/GooglePlayServicesUtil: The Google Play services resources were not found:如果没用到Google Play相关功能,这个警告可以忽略;如果用到了,要确保项目正确引入了Google Play服务依赖。I/Choreographer: Skipped 63 frames...:说明主线程有耗时操作,优化WebView代码后应该会缓解,不是加载失败的核心原因。
最后测试:用已知有效的URL验证
如果上面的配置都检查过了还是加载不出来,建议先替换成一个公开的测试URL,比如:
documentOpener.loadUrl("https://www.google.com");
如果这个能正常显示,说明问题肯定出在你传入的nomeDispensa地址上;如果还是不行,可能是WebView的系统配置问题(比如模拟器WebView版本过低),可以尝试更新模拟器系统或用真机测试。
内容的提问来源于stack exchange,提问作者user9847949
相关产品推荐
相关产品推荐

