【问题标题】:Kotlin: Error 503 when loading image from flickr with PicassoKotlin:使用 Picasso 从 flickr 加载图像时出现错误 503
【发布时间】:2022-08-21 20:52:33
【问题描述】:

我的应用程序使用 Android 的 Picasso 库从 flickr 加载图像。奇怪的是,在将我的应用程序迁移到 Kotlin 后,它工作正常,但现在我开始出现“随机”503 错误。

我已经在 flickr 控制面板中为每个图像设置了所有权限,因此它们是完全公开的,并将安全设置为最低级别无济于事。

起初我认为降低 flickr 的安全性是关键,但这是错误的,因为我仍然有这个问题。也许它根本与 Kotlin 迁移无关,但我记得不久前它运行良好。

奇怪的是,如果我调试并复制 url 并将其粘贴到浏览器中,它就可以正常加载。

接下来是我加载主屏幕图像的方法:

private fun setTodaysThoughtPainting() {
    binding!!.ivTtodaysThought.setOnClickListener { v: View? -> startThoughtActivity(\"\") }
    val isTodayThought = AWPreferences.todayThoughtPrefIsToday(this)
    mainPainting = mainViewModel!!.getTodaysPainting(isTodayThought)
    //FLICKR URL EXAMPLE: mainPainting.setUrl(\"https://live.staticflickr.com/xxx/xxx_xxx_o_d.jpg\");
    if (mainPainting != null) {
        Picasso.get().load(mainPainting!!.url)
            .transform(RoundedTransformation(cornerRadius, 0))
            .into(binding!!.ivTtodaysThought, object : Callback {
                override fun onSuccess() {
                    trackId = mainViewModel!!.getTodaysTrack(isTodayThought)
                    mainThought = mainViewModel!!.getTodaysThought(
                        mainPainting,
                        isTodayThought,
                        idLanguage,
                        trackId
                    )
                    if (mainThought != null) {
                        setMainShortenThought(mainThought!!)
                        setMainThoughtDate(Calendar.getInstance())
                        binding!!.ivTtodaysThought.viewTreeObserver.addOnGlobalLayoutListener(
                            object : OnGlobalLayoutListener {
                                override fun onGlobalLayout() {
                                    binding!!.ivTtodaysThought.viewTreeObserver.removeOnGlobalLayoutListener(
                                        this
                                    )
                                    val realImgSize = ImageHelper.getRealImageSize(
                                        binding!!.ivTtodaysThought
                                    )
                                    setThoughtMargin(realImgSize[0])
                                }
                            })
                    }
                }

                override fun onError(e: Exception) {
                    e.printStackTrace()
                }
            })
    }
}

有什么帮助吗?

编辑1:

这是毕加索堆栈跟踪:

2022-06-15 23:59:03.231 32258-32258/com.xxx.xxx W/System.err: com.squareup.picasso.NetworkRequestHandler$ResponseException: HTTP 503
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.NetworkRequestHandler.load(NetworkRequestHandler.java:51)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:219)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:175)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.lang.Thread.run(Thread.java:929)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:354)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err: com.squareup.picasso.NetworkRequestHandler$ResponseException: HTTP 503
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.NetworkRequestHandler.load(NetworkRequestHandler.java:51)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:219)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:175)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.lang.Thread.run(Thread.java:929)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:354)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err: com.squareup.picasso.NetworkRequestHandler$ResponseException: HTTP 503
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.NetworkRequestHandler.load(NetworkRequestHandler.java:51)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:219)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:175)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2022-06-15 23:59:03.232 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2022-06-15 23:59:03.233 32258-32258/com.xxx.xxx W/System.err:     at java.lang.Thread.run(Thread.java:929)
2022-06-15 23:59:03.233 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:354)
2022-06-15 23:59:03.282 32258-32258/com.xxx.xxx W/System.err: com.squareup.picasso.NetworkRequestHandler$ResponseException: HTTP 503
2022-06-15 23:59:03.282 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.NetworkRequestHandler.load(NetworkRequestHandler.java:51)
2022-06-15 23:59:03.283 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:219)
2022-06-15 23:59:03.283 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:175)
2022-06-15 23:59:03.283 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
2022-06-15 23:59:03.283 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2022-06-15 23:59:03.283 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2022-06-15 23:59:03.283 32258-32258/com.xxx.xxx W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2022-06-15 23:59:03.283 32258-32258/com.xxx.xxx W/System.err:     at java.lang.Thread.run(Thread.java:929)
2022-06-15 23:59:03.283 32258-32258/com.xxx.xxx W/System.err:     at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:354)

编辑1:

经过几个月的努力,我终于发现这个问题与毕加索无关。

我将图像存储在 Flickr 中,我的结论是 Flickr 团队可能已经进行了更改(例如安全更改或其他),因为我尝试使用不同的域测试图像,具体为 this 及其工作。我已经写了 Flickr 支持,但还没有回复。

我仍然坚持这一点。

编辑2:

这没有任何意义,但是当每个图像的配置相同时,有些图像有效,有些图像无效。

比以往任何时候都更卡住:)

  • 我面临同样的问题。您找到解决方案了吗?
  • 你好@Abhi,不幸的是还没有,我不知道在哪里可以从 StackOverflow 中找到帮助:s
  • 我可以使用 Glide 加载图像,但不能使用 Picasso。如果使用不同的库不是问题,那么您可以使用 Glide。
  • 感谢@Abhi 的输入。我会考虑的,但这不正常。我在我的所有应用程序中都使用 Picasso,将所有应用程序都迁移到 Glide 会让人头疼。
  • 请看我的编辑@dnhyde

标签: android image kotlin picasso http-status-code-503


【解决方案1】:

Error 503 表示:

503服务不可用: 超文本传输​​协议 (HTTP) 503 服务不可用服务器错误响应代码表示 服务器尚未准备好处理请求。

也许他们在服务器上有一些作品。我可以建议你稍后再试。

【讨论】:

  • 感谢您的回复@Roman Chekashov。这似乎不是典型的 503 错误案例。而且我很确定这不是偶然的,因为在应用程序的其他部分中,我也使用毕加索加载图像,它工作正常(这个问题已经有很多天了)。这很奇怪,但我怀疑它发生在列表中的最后一张图片上。听起来可能很废话,但简而言之,我的应用程序每天都会在家中加载一张新图片,下面有一个 RecyclerView 显示过去图像的记录,并且 Recycler 中的图像加载得很好,但不是“当前”。
  • 我现在不在家,但我在想也许过去的图像加载没有问题,因为它们被缓存了,实际上毕加索使用图像缓存,但最后一张(当前)图片尚未下载所以它没有被缓存。这有一定的道理,但仍然需要弄清楚为什么当前图像中出现 503 错误。
  • 请看我的编辑@Roman Chekashov
【解决方案2】:

我知道这个问题,但由于某种原因,它适用于 Glide 库而不是 Picasso 库。

我也收到 503 错误,这意味着“服务不可用”。起初我还认为这个问题与 Flickr 服务器有关,但我不能 100% 确定它是否真的是一个问题,或者它是这样设计的。我猜 Flickr 限制了您可以使用免费套餐发出多少请求,以及何时/如果您超过该限制,您将收到 503 错误。

我的猜测是 Glide 正在排队等待 Picasso 没有的请求。我实际上创建了一个单独的类来测试这个理论,我在其中处理图像请求的排队并且它起作用了。

让我知道我的回答是否对您有任何帮助。

【讨论】:

  • 好吧@Abhi,事实是,如果我在浏览器中尝试 Flickr 网址,我会正确看到图像,这没有任何意义,让我相信我们所有的理论都失败了。另一方面,我尝试使用不同的域图像 url,毕加索只是毫无问题地加载它。就我而言——就在今天——我用 Glide 做了一些测试,但无法让它工作,即使是另一个测试图像,但这是另一个主题。也许我应该将您的答案标记为正确,但我更愿意等着看是否有任何使用找到了明确的解决方案。我会联系 Flickr 支持并通知您。
  • 当然!如果您从他们那里听到什么或找到什么,请告诉我。如果我发现什么,我会更新你。
  • 你知道是什么让我觉得 Flickr 做了一些改变@Abhi?我记得当我开始开发我的应用程序时,它在 Flickr 上运行良好,不久前就停止了。好的,一旦我有时间与他们取得联系,我会及时通知您,以便您更新答案,我们绝对可以将其设置为正确的。
  • 当然!听起来不错 :)
【解决方案3】:

我也从 flickr 收到了这个 503 错误。唯一的区别是我将 Coil 与 Compose 一起使用。就我而言,我刚刚添加了标题并停止收到 503 错误。

@Composable
private fun PhotoItem(
    photoUrl: String,
) {
    val model = ImageRequest.Builder(LocalContext.current)
        .data(photoUrl)
        .addHeader("Accept-Encoding", "keep-alive")
        .addHeader("Connection", "gzip, deflate, br")
        .addHeader("User-Agent", "SomeUserAgent")
        .build()
    AsyncImage(
        modifier = Modifier
            .fillMaxWidth(),
        model = model,
        contentDescription = null,
        onState = { state ->
            when (state) {
                is AsyncImagePainter.State.Error -> {
                    // logs
                }
                else -> {}
            }
        }
    )
}

仍然不知道它是否有帮助,因为后来它也开始在没有标题的情况下工作。

【讨论】:

    【解决方案4】:

    好的,经过大量时间和头痛后,我终于找到了解决方案。

    显然(根据我的调查),问题来自关于 https 和 http 连接的 Android 安全限制。由于默认情况下禁用 Marshmallow http 连接,因此我发现的工作解决方案是在 AndroidManifest.xml 的“应用程序”标签中添加下一个设置,以消除此限制。

    android:usesCleartextTraffic="true"
    

    我不知道这是否是最好的解决方案,甚至不知道它是否安全,但考虑到我目前在这方面投入了大量时间,我将保持这种状态。

    我认为正确的解决方案应该朝着以下方向发展:

    https://stackoverflow.com/a/61890208/2807741

    但是我做了一个快速测试,没有用。

    编辑1:

    好吧,我受够了这个,它似乎是一个解决方案最终不是它。今天我再次测试,即使设置了 android:usesCleartextTraffic="true",我在使用 Picasso 加载图像时得到一个 http 503。

    这很恶心。

    【讨论】:

      猜你喜欢
      • 2019-11-16
      • 2020-02-14
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2019-08-20
      相关资源
      最近更新 更多