您的位置:

CancellationException()的处理方案

  发布时间:2023-01-27 21:30:02
使用View的tag属性绑定请求,在重新加载页面时取消上一次请求。在使用Glide加载图片时,在回调中使用isCancelled()判断是否已被取消。使用例子当然有,下面是使用生命周期监听取消加载图片的示例这里我们在Fragment的onAttach()方法中初始化了RequestManager,在onStart()方法中恢复请求,在onStop()和onDetach()方法中暂停请求。这只是两种解决方案的示例,还有其他更多的解决方案,您可以根据自己的需要选择合适的方案。

报错的原因

在Java中,Glide出现CancellationException可能是由于在加载图片时取消了请求导致的。这可能是由于在请求图片时离开了该页面或在加载图片时重新加载了该页面导致的。这也可能是由于在请求图片时使用了Cancellable的cancel()方法来取消请求。

如何解决

解决这个问题可以有以下几种方法:

1. 使用Activity或Fragment的生命周期监听,在页面离开时取消加载图片。

2. 使用View的tag属性绑定请求,在重新加载页面时取消上一次请求。

3. 使用RequestManager的clear()方法,在重新加载页面时取消上一次请求。

4. 在使用Glide加载图片时,在回调中使用isCancelled()判断是否已被取消。

5. 在使用 Glide.with().clear()来清除未被使用的图片,避免内存泄漏

这些方法都可以有效避免出现CancellationException。 您可以根据自己的需要选择一种方法来解决这个问题。

使用例子

当然有,下面是使用生命周期监听取消加载图片的示例:


public class MyFragment extends Fragment {
    private RequestManager requestManager;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        requestManager = Glide.with(this);
    }

    @Override
    public void onStart() {
        super.onStart();
        requestManager.resumeRequests();
    }

    @Override
    public void onStop() {
        super.onStop();
        requestManager.pauseRequests();
    }

    @Override
    public void onDetach() {
        super.onDetach();
        requestManager.pauseRequests();
    }
}

这里我们在Fragment的onAttach()方法中初始化了RequestManager,在onStart()方法中恢复请求,在onStop()和onDetach()方法中暂停请求。

另一个示例是在Glide加载图片时使用isCancelled()判断是否已被取消


Glide.with(this).load(imageUrl).listener(new RequestListener() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
                return false;
            }
            @Override
            public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
                if(!target.getRequest().isCancelled()){
                    // do something
                }
                return false;
            }
        }).into(imageView);

这里我们在Glide加载图片时使用了listener,在其中判断请求是否已被取消,如果没有被取消就做一些事情。

这只是两种解决方案的示例,还有其他更多的解决方案,您可以根据自己的需要选择合适的方案。