Android中SwipeRefreshLayout与自定义WebViewClient共存加载异常
解决Android WebView下拉刷新指示器持续加载的问题
我来帮你分析下你遇到的问题,然后一步步给出解决方案:
问题根源
从你的代码来看,导致下拉刷新指示器一直转动的原因主要有两个:
- 未触发WebView重新加载:在
onRefresh方法中,你只设置了一个临时的WebViewClient,但没有调用webView.loadUrl()或webView.reload()来触发页面重新加载,所以onPageFinished方法永远不会执行,刷新状态也就无法停止。 - WebViewClient被重复覆盖:你在
onRefresh内设置了一个新的WebViewClient,之后又在外部设置了自定义的GeoWebViewClient,这会导致你的外部链接处理逻辑被覆盖,同时刷新状态的处理也会混乱。
解决方案
我们需要把自定义GeoWebViewClient的逻辑和刷新状态的处理结合起来,避免重复设置WebViewClient,同时确保页面加载完成后停止刷新。
步骤1:修改自定义GeoWebViewClient
让它能接收SwipeRefreshLayout的引用,在页面加载完成时自动停止刷新,同时保留你原来的外部链接处理逻辑:
public class GeoWebViewClient extends WebViewClient { private SwipeRefreshLayout mSwipeRefreshLayout; // 构造方法传入SwipeRefreshLayout public GeoWebViewClient(SwipeRefreshLayout swipeRefreshLayout) { mSwipeRefreshLayout = swipeRefreshLayout; } // 你的外部链接处理逻辑(保留你原来的代码) @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 示例逻辑:判断是否为目标域名,同一域名在WebView内打开,外部链接跳转系统浏览器 if (Uri.parse(url).getHost().equals("www.zomato.com")) { return false; // 同一域名,WebView自行处理 } // 外部链接,用系统浏览器打开 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); view.getContext().startActivity(intent); return true; } // 页面加载完成后停止刷新 @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (mSwipeRefreshLayout != null && mSwipeRefreshLayout.isRefreshing()) { mSwipeRefreshLayout.setRefreshing(false); } } }
步骤2:修改Desc.java中的代码
只设置一次GeoWebViewClient,并在下拉刷新时触发WebView重新加载:
SwipeRefreshLayout swipe; WebView webView; // 移除static修饰符,避免内存泄漏 @Override public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); webView = view.findViewById(R.id.Zomato); swipe = view.findViewById(R.id.swipe2); // 初始化WebView基础设置(根据你的需求添加,比如启用JS) WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); // 设置自定义的GeoWebViewClient,传入SwipeRefreshLayout webView.setWebViewClient(new GeoWebViewClient(swipe)); // 设置下拉刷新监听器 swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { if (webView != null) { // 方式1:重新加载当前页面 webView.reload(); // 方式2:每次刷新都加载初始URL(根据你的需求选择) // webView.loadUrl("https://www.zomato.com/"); } } }); // 初始加载目标页面 webView.loadUrl("https://www.zomato.com/"); }
额外注意事项
- 不要给
WebView加static修饰符,否则容易引发内存泄漏问题。 - 确保在Fragment的
onDestroyView方法中销毁WebView,避免内存泄漏:
@Override public void onDestroyView() { if (webView != null) { webView.destroy(); webView = null; } super.onDestroyView(); }
内容的提问来源于stack exchange,提问作者nikhil arora
相关产品推荐
相关产品推荐

