加载WebView时的Android进度条

59
在我的应用中,我有一个WebView,可以加载来自互联网的任何URL。由于网络缓慢,有时页面需要很长时间才能加载,用户只会看到一个空白屏幕。

我想在WebView加载时显示一个ProgressBar,并在WebView完全加载后隐藏ProgessBar

我知道如何使用ProgressBarAsyncTask,但这是我的问题所在。

这是我用来加载WebView的代码。

    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.setWebViewClient(new HelloWebViewClient());
    mWebView.loadUrl(web_URL);

这是我的自定义 WebViewClient

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

现在,如果我想使用 AsyncTask 显示 ProgressBar,那么我想我必须将加载 URL 的代码放入 AsyncTask 中的 doInBackground() 函数中,并通过 onProgressUpdate() 函数显示进度。

但是,我该如何在 doInBackground() 中加载URL呢?因为 doInBackground()非 UI 线程 上运行,我无法在其内部使用 mWebView.loadUrl(web_URL)

有什么建议吗?我是否忽略了一些明显的东西?请指导我。


可能重复:https://dev59.com/km855IYBdhLWcg3wc0Dy - Shrikant Ballal
1
在这个Stack Overflow的问题中得到了完美的解释:http://stackoverflow.com/questions/5207540/android-webview - Goofyahead
可能是Android WebView进度条的重复问题。 - e-sushi
http://web.archive.org/web/20120615002739/http://www.chrisdanielson.com/2010/05/04/android-webview-and-the-indeterminant-progress-solution/ - General Grievance
12个回答

0
在Webview加载页面时展示加载器的更好方法 我在BaseActivity中创建了一个加载器:
lateinit var loader: Dialog


loader = Loader.getLoader(this)

在Webview Activity中。
webView.settings.javaScriptEnabled = true
        webView.addJavascriptInterface(MyJavaScriptInterface(this@MbWayWebViewActivity), "HtmlViewer")
        webView.settings.setSupportZoom(true)
        webView.settings.builtInZoomControls = true

        webView.webViewClient = object : WebViewClient() {
            @Deprecated("Deprecated in Java")
            override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                loader.show()
                return false
            }
            override fun onPageFinished(view: WebView?, url: String?) {
                super.onPageFinished(view, url)
                loader.dismiss()
                binding.webView.loadUrl("javascript:HtmlViewer.showHTML" + "('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');")

            }
        }

在 shouldOverrideUrlLoading 方法中显示加载器,并在 onPageFinished 中关闭加载器。

希望您的问题得到解决。


0
    WebView webView;
ProgressDialog progressDialog;

TextView text;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_web_view);


    String message = getIntent().getStringExtra("key").toString();
    setTitle(message);
    Bundle isNetworkAvailable = getIntent().getExtras();

    String value = "file:///android_asset/n/o/i/no_connection.html";
    if (isNetworkAvailable()) {
        value = isNetworkAvailable.getString("keyHTML");
    }
    webView = (WebView) findViewById(R.id.kamal);
    webView.loadUrl(value);
    init();
}

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

private void init() {
    webView = (WebView) findViewById(R.id.kamal);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.setBackgroundColor(0);
    webView.getSettings().setJavaScriptEnabled(true);
    progressDialog = new ProgressDialog(WebView_Online.this);
    progressDialog.setMessage("Loading Please wait...");
    progressDialog.setCancelable(false);
    progressDialog.show();
    webView.setWebViewClient(new WebViewClient() {
        public void onPageFinished(WebView view, String url) {
            try {
                progressDialog.dismiss();
            } catch (Exception e) {
                e.printStackTrace();

            }
        }

    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接