WebView加载页面后ProgressDialog无法关闭,求技术协助
解决WebView加载完成后ProgressDialog无法关闭的问题
嘿,我来帮你搞定这个问题!你现在的核心问题很明确:只实现了页面开始加载时显示ProgressDialog的逻辑,但完全没处理页面加载完成后关闭对话框的操作,所以对话框会一直停在那儿。
下面是具体的修复步骤和优化建议:
1. 重写onPageFinished方法关闭对话框
在你的WebViewClient里,除了onPageStarted,还需要重写onPageFinished方法,在这个方法里关闭ProgressDialog并停止下拉刷新:
// 把static的ProgressDialog改成Fragment的成员变量,避免内存泄漏 private ProgressDialog progressDialog; @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 初始化ProgressDialog,放在这里更安全 progressDialog = new ProgressDialog(getActivity()); progressDialog.setMessage("Loading..."); progressDialog.setCancelable(false); // 根据需求设置是否可取消 mWebView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); swipeRefreshLayout.setRefreshing(true); // 检查Activity是否还存在,避免空指针 if (getActivity() != null && !progressDialog.isShowing()) { progressDialog.show(); } } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); swipeRefreshLayout.setRefreshing(false); // 关闭对话框,同样要做空安全检查 if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } } }); }
2. 处理Fragment生命周期,避免内存泄漏
在Fragment销毁视图的时候,记得销毁ProgressDialog,防止内存泄漏:
@Override public void onDestroyView() { super.onDestroyView(); if (progressDialog != null) { progressDialog.dismiss(); progressDialog = null; } }
额外提醒
- 别用
static修饰ProgressDialog:static变量会一直持有Fragment的引用,很容易导致内存泄漏,改成Fragment的成员变量就好。 - 空安全检查:Fragment和Activity的生命周期绑定,所以操作ProgressDialog前一定要检查Activity是否还存活,避免空指针异常。
这样修改后,WebView加载完成时,ProgressDialog就会自动关闭啦!
内容的提问来源于stack exchange,提问作者Suman Dey
相关产品推荐
相关产品推荐

