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

Android中SwipeRefreshLayout与自定义WebViewClient共存加载异常

解决Android WebView下拉刷新指示器持续加载的问题

我来帮你分析下你遇到的问题,然后一步步给出解决方案:

问题根源

从你的代码来看,导致下拉刷新指示器一直转动的原因主要有两个:

  1. 未触发WebView重新加载:在onRefresh方法中,你只设置了一个临时的WebViewClient,但没有调用webView.loadUrl()或webView.reload()来触发页面重新加载,所以onPageFinished方法永远不会执行,刷新状态也就无法停止。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:57:53