Glide下载图片url省略默认端口

最近遇到一个问题,我们在用Glide加载图片的时候,进度条一直为零。

后来发现是Glide进行下载的时候url会自动将url的默认端口去掉导致。记录如下。

 

首先来看我们的进度条实现逻辑

1.将下载的downloadUrl当做key 绑定相应的回调事件。

比如 http://www.test.com:80/abc.jpg

2.下载时,根据下载的url取回回调事件,并触发回调事件。

进度条是写了一个拦截器

public class ProgressInterceptor implements Interceptor {

    static final Map<String, ProgressListener> LISTENER_MAP = new HashMap<>();

    public static void addListener(String url,ProgressListener listener) {
        LISTENER_MAP.put(url, listener);
    }

    public static void removeListener(String url) {
        LISTENER_MAP.remove(url);
    }

    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);
        String url = request.url().toString();
        ResponseBody body = response.body();
        return response.newBuilder().body(new ProgressResponseBody(url, body)).build();
    }

}

这个地方url就是去掉默认端口的url了 http://www.test.com/abc.jpg

再看

request.url().toString() 是如何拿到的

HTTPUrl.java的url赋值

  HttpUrl(Builder builder) {
    this.scheme = builder.scheme;
    this.username = percentDecode(builder.encodedUsername, false);
    this.password = percentDecode(builder.encodedPassword, false);
    this.host = builder.host;
    this.port = builder.effectivePort();
    this.pathSegments = percentDecode(builder.encodedPathSegments, false);
    this.queryNamesAndValues = builder.encodedQueryNamesAndValues != null
        ? percentDecode(builder.encodedQueryNamesAndValues, true)
        : null;
    this.fragment = builder.encodedFragment != null
        ? percentDecode(builder.encodedFragment, false)
        : null;
    this.url = builder.toString();
  }

HttpUrl.java中tostring方法。这里可以看到 有个effectivePort的判定,如果是默认端口就去掉。所以

 @Override public String toString() {
      StringBuilder result = new StringBuilder();
      result.append(scheme);
      result.append("://");

      if (!encodedUsername.isEmpty() || !encodedPassword.isEmpty()) {
        result.append(encodedUsername);
        if (!encodedPassword.isEmpty()) {
          result.append(':');
          result.append(encodedPassword);
        }
        result.append('@');
      }

      if (host.indexOf(':') != -1) {
        // Host is an IPv6 address.
        result.append('[');
        result.append(host);
        result.append(']');
      } else {
        result.append(host);
      }

      int effectivePort = effectivePort();
      if (effectivePort != defaultPort(scheme)) {
        result.append(':');
        result.append(effectivePort);
      }

      pathSegmentsToString(result, encodedPathSegments);

      if (encodedQueryNamesAndValues != null) {
        result.append('?');
        namesAndValuesToQueryString(result, encodedQueryNamesAndValues);
      }

      if (encodedFragment != null) {
        result.append('#');
        result.append(encodedFragment);
      }

      return result.toString();
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hi! How can I help you with Glide today? I want to download an image using Glide in Android. Can you help me with that? Of course! I'd be happy to help you download an image using Glide in Android. To start, you'll need to add the Glide library to your project. You can do this by adding the following line to your app's build.gradle file: ``` implementation 'com.github.bumptech.glide:glide:4.11.0' ``` Once you've added the library, you can use the following code to download an image: ``` Glide.with(this) .load("https://www.example.com/image.jpg") .into(imageView); ``` Here, `this` refers to the context of your activity, and `imageView` is the ImageView where you want to display the image. Is there anything else I can help with? ### 回答2: Glide是一款适用于Android平台的图片加载框架,能够简化开发者在应用程序中下载和展示图片的工作流程。使用Glide下载图片需要以下几个步骤。 首先,需在项目的build.gradle文件中加入Glide的依赖库。可以通过在`dependencies`模块中添加`implementation 'com.github.bumptech.glide:glide:4.12.0'`来引入最新版的Glide。 接下来,在需要下载和展示图片的地方,需要创建一个Glide请求对象。使用Glide.with()方法,传入当前的`Context`对象,来获取Glide请求管理器。然后,使用`load()`方法指定图片URL地址或资源id,来创建一个Glide请求对象。 随后,可以使用Glide请求对象中的一系列方法进行配置。比如,可以使用`placeholder()`方法设置一个占位图片,用于在图片加载完成前显示。可以使用`error()`方法设置一个错误图片,在加载失败时显示。还可以使用`override()`方法设置图片的尺寸大小。 然后,可以调用`into()`方法,将要展示图片的ImageView对象作为参数传入,将Glide请求对象与ImageView绑定起来。 最后,需要注意在适当的地方调用`Glide.with(context).pauseRequests()`方法停止请求,以免在Activity或Fragment销毁时发生内存泄漏。同时,可以在应用程序的Application类中调用`Glide.with(context).onTrimMemory()`和`Glide.with(context).onLowMemory()`方法,优化图片加载的性能。 综上所述,通过以上步骤,就可以使用Glide轻松地下载和展示图片,为Android应用程序提供良好的用户体验。 ### 回答3: Android 开发中,使用 Glide 库可以简便地下载和展示图片Glide 是一个强大、灵活、高效的图片加载库,能够帮助 Android 开发者在应用中加载、缓存、展示各种类型的图片。使用 Glide 下载图片非常简单,只需几行代码即可完成。 首先,需要在项目的 build.gradle 文件中添加 Glide 的依赖项。可以在官方网站上找到最新的版本号并添加到 dependencies 部分。 接下来,在代码中使用 Glide 进行图片下载。首先,需要获取一个 ImageView 的实例,用于显示下载图片。然后,通过调用 Glide 的 with() 方法,传入一个 Context 对象和需要下载图片 URL,创建一个 GlideRequest 对象。最后,通过调用 GlideRequest 对象的 into() 方法,将下载图片显示在 ImageView 中。 若需要设置特定的图片大小或占位符,可以使用 GlideRequest 对象的相应方法进行设置。例如,通过调用 override() 方法设置图片大小,调用 placeholder() 方法设置占位符等。 此外,Glide 还提供了许多其他功能,例如本地缓存、内存缓存、动画等。可以根据项目的需求对 Glide 进行更多的配置和使用。 总的来说,使用 Glide 下载图片非常方便。通过简单的几行代码,我们就能够实现图片下载和展示,同时还可以享受 Glide 强大的额外功能。利用 Glide,我们可以轻松地加载不同来源的图片,并提升应用的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值