执行第二次 Volley 请求 Android Studio 时 URL 错误

问题描述 投票:0回答:1

移动开发新手,正在学习一组视频教程。我在活动开始时执行 JSON 对象请求。我需要执行第二个请求,但这次是使用从 JSON 对象获取的链接来获取图像。第一个请求大部分有效,更新了除一个 TextView 之外的所有 TextView。包含图像链接的 TextView 只是显示“https://”而不是整个链接,并且 ImageView 根本不会更改,因为图像请求由于“错误 URL”而失败。

这是我目前使用的 Volley 版本:

implementation 'com.android.volley:volley:1.2.1'

我的第一个请求如下所示:

val request = JsonObjectRequest(Request.Method.GET, requestURL, null, { response ->

            for (i in 0 until response.length()) {
                txtName.text = getString(R.string.name,response.getString("Title"))
                txtRating.text = getString(R.string.rating,response.getString("Rated"))
                txtSummary.text = getString(R.string.summary, response.getString("Plot"))
                txtGenre.text = getString(R.string.genre,response.getString("Genre"))
                txtLength.text = getString(R.string.length,response.getString("Runtime"))           
                txtUrl.text = getString(R.string.url,response.getString("Poster"))

                Log.d("Poster Link", posterLink)
            }
            Log.d("Response", "$response")
        }, {

            Log.d("Error Message", "Error: ${it.message}")
        })

        request.setShouldCache(false)
        RequestHandler.getInstance(applicationContext).addToRequestQueue(request)

我在 onCreate 中有它。该请求有效,它更改了大多数 TextView 以显示我请求的字段(链接 TextView 除外)。如果这有帮助,在 logcat 中,这是我从该特定搜索的请求中获得的信息:

{"Title":"Star Wars: Episode IV - A New Hope","Year":"1977","Rated":"PG","Released":"25 May 1977","Runtime":"121 min","Genre":"Action, Adventure, Fantasy","Director":"George Lucas","Writer":"George Lucas","Actors":"Mark Hamill, Harrison Ford, Carrie Fisher","Plot":"Luke Skywalker joins forces with a Jedi Knight, a cocky pilot, a Wookiee and two droids to save the galaxy from the Empire's world-destroying battle station, while also attempting to rescue Princess Leia from the mysterious Darth ...","Language":"English","Country":"United States","Awards":"Won 6 Oscars. 65 wins & 31 nominations total","Poster":"https:\/\/m.media-amazon.com\/images\/M\/MV5BOTA5NjhiOTAtZWM0ZC00MWNhLThiMzEtZDFkOTk2OTU1ZDJkXkEyXkFqcGdeQXVyMTA4NDI1NTQx._V1_SX300.jpg","Ratings":[{"Source":"Internet Movie Database","Value":"8.6\/10"},{"Source":"Rotten Tomatoes","Value":"93%"},{"Source":"Metacritic","Value":"90\/100"}],"Metascore":"90","imdbRating":"8.6","imdbVotes":"1,393,554","imdbID":"tt0076759","Type":"movie","DVD":"06 Dec 2005","BoxOffice":"$460,998,507","Production":"N\/A","Website":"N\/A","Response":"True"}

然后我有一个函数请求如下所示的图像:

fun imgRequest(link : String){
var img = createBitmap(1000,1000)

        val imageRequest = ImageRequest(link, { response ->
            img = response

            Log.d("Image Request Function", "Image requested")
        }, 0,  0, ImageView.ScaleType.FIT_CENTER, Bitmap.Config.ARGB_8888,
            {
                Log.d("Error Message", "Error: ${it.message}")
            })

        imageRequest.setShouldCache(false)
        RequestHandler.getInstance(applicationContext).addToRequestQueue(imageRequest)

        imgView.setImageBitmap(img)
}

我尝试过在 JSON 对象请求之后调用该函数,也尝试过放弃该函数并在对象请求之后发布图像请求。它基本上只是应该将我拥有的 ImageView“imgView”更改为我请求的图像。我使用“Log.d”来查看它是否正确获取了链接,并且在第一个请求期间在 logcat 中,仅包含链接的 Log.d 消息如下所示:

https://m.media-amazon.com/images/M/MV5BOTA5NjhiOTAtZWM0ZC00MWNhLThiMzEtZDFkOTk2OTU1ZDJkXkEyXkFqcGdeQXVyMTA4NDI1NTQx._V1_SX300.jpg
当我点击它时,图像成功地在新窗口中弹出。尽管由于某种原因,在请求之外,当我将 TextView.text 设置为它时,它变成了“https://”。此外,Logcat 在图像请求失败时向我提供以下消息:

[1094] NetworkDispatcher.processRequest: Unhandled exception java.lang.RuntimeException: Bad URL 
                                                                                                    java.lang.RuntimeException: Bad URL 
                                                                                                    

我关注的视频将此任务作为一种独立的挑战放在视频的末尾,因此我无法在那里找到解决方案。我尝试移动图像请求,我尝试声明位图以将图像存储在 onCreate 上方脚本的顶部,我也尝试在那里声明一个空的 var 字符串“link”,然后更改它到对象响应后的链接。我还尝试在 JSON 对象请求中执行图像请求,但这确实不起作用。我不知道出了什么问题,也不知道应该在哪里解决这个问题。

android-studio kotlin android-volley jsonobjectrequest malformedurlexception
1个回答
0
投票

我的假设是,有一些特殊字符需要在尝试直接使用的 URL 中进行编码。在启动图像请求之前清理 url 是一个很好的做法。

例如,在启动

Uri.Builder().parse(amazonImgUrl).toString()
之前使用
ImageRequest
对 url 进行编码。

© www.soinside.com 2019 - 2024. All rights reserved.