【问题标题】:Cannot get a certain Image from a URL Java无法从 URL Java 获取特定图像
【发布时间】:2021-03-04 15:00:14
【问题描述】:

我正在 Android Studio 中使用来自此 URL https://orteil.dashnet.org/cookieclicker/img 的图像的应用程序


此目录中的所有图片都可以使用,除了这张图片:https://orteil.dashnet.org/cookieclicker/img/buildings.png

关于这张图片的奇怪之处在于,如果我将它保存在可绘制文件夹中,它会很好地加载这张图片。当我运行它时,InputStream 行抛出“java.net.ProtocolException: Too many follow-up requests: 21”。这是我无法从目录加载的唯一图像。有人能解释一下为什么 InputStream 会为此图像抛出 ProtocolException 吗?

这是我正在运行的代码。注意——这段代码在一个新线程上运行

//src is the  bad url as a string
//myBitmap is a Bitmap array
try {
    URL url = new URL(src);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    InputStream input = connection.getInputStream();
    myBitmap[0] = BitmapFactory.decodeStream(input);

} catch ( IOException e) {
   e.printStackTrace();
}

【问题讨论】:

  • 您是否已授予互联网权限?
  • 使用glide直接将你的图片从url设置为imageView
  • 我给了它互联网许可。我会尝试使用 glide 看看它是否有效。如果有人能解释为什么 InputStream 有问题,那将不胜感激

标签: java android image httpurlconnection android-bitmap


【解决方案1】:

为什么要使用流连接进行图像加载....您可以在Glide 中获得更好的性能并处理此类连接问题

如果您不想使用来自 URL 的位图:

GlideApp.with(itemView.getContext())
        .asBitmap()
        .load(imageUrl)  //https://orteil.dashnet.org/cookieclicker/img/buildings.png
        .into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {}
            });
        }

【讨论】:

  • 好的,你能解释一下为什么与我使用的方法相比它有效吗?
  • 在从 URL 读取块时需要一直保持 HttpConnection 活动时存在一个问题,但是如果文件出现问题,则此连接在 EOF 之前关闭。如果这解决了您的问题,那么这个答案必须被接受
【解决方案2】:

我发现 URL 实际上有多个特定图像的副本。因此,代码将 ping 所有图像,直到达到 21 个请求上限。我修复它的方法是添加参数 v=7。这指定了我想要的副本,现在它可以工作了。希望如果其他人遇到这个问题,这种解决方案可以解决它。

【讨论】:

    猜你喜欢
    • 2019-11-27
    • 2012-05-04
    • 2015-10-29
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多