You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:05:18