我一步一步地仔细观察每件事,但我找不到问题所在。每当我填写我要搜索的电影的名称时,应用程序就会崩溃,它说: java.lang.NullPointerException: response.body()不能为null
有人知道吗?下面是下面的代码。
MovieList.kt
class MovieList {
val imdbID: String
val Title: String
val Year: String
val Plot: String
val Poster: String
constructor(imdbID: String, Title: String, Year: String, Plot: String, Poster: String) {
this.imdbID = imdbID
this.Title = Title
this.Year = Year
this.Plot = Plot
this.Poster = Poster
}
}OMDbApi.kt
interface OMDbApi {
@GET("t={Title}")
fun getMovieByTitle(@Path("Title") Title: String): Call<MovieList>
}OMDbApiClient.kt
class OMDbApiClient {
companion object{
private var omdbapi: OMDbApi? = null
fun getOMDbApi(): OMDbApi?{
if(omdbapi == null){
omdbapi = Retrofit.Builder()
.baseUrl("http://www.omdbapi.com/?&apikey=eb73867f")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(OMDbApi::class.java);
}
return omdbapi
}
}
}FirstFragment.kt
class FirstFragment : Fragment() {
private lateinit var omdbapiClient: OMDbApi
private lateinit var tvMovieTitle: TextView
private lateinit var ivImagePoster: ImageView
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_first, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
omdbapiClient = OMDbApiClient.getOMDbApi()!!
val movieId: EditText = view.findViewById<EditText>(R.id.TitleId)
tvMovieTitle = view.findViewById(R.id.MovieTitleId)
ivImagePoster = view.findViewById(R.id.MoviePosterId)
movieId.setOnEditorActionListener { v, actionId, event ->
if(actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_ACTION_NEXT){
val movietitle: String = movieId.text.toString()
searchMovieByTitle(movietitle)
true
}
else{
Toast.makeText(activity, "Error!", Toast.LENGTH_LONG).show()
false
}
}
}
private fun searchMovieByTitle(movietitle: String) {
omdbapiClient.getMovieByTitle(movietitle).enqueue(object : Callback<MovieList>{
override fun onResponse(call: Call<MovieList>?, response: Response<MovieList>) {
displayData(response.body())
Toast.makeText(activity, "Success!", Toast.LENGTH_LONG).show()
}
override fun onFailure(call: Call<MovieList>?, t: Throwable?) {
Toast.makeText(activity, "Error!", Toast.LENGTH_LONG).show()
}
})
}
private fun displayData(data: MovieList) {
tvMovieTitle.text = data.Title
Glide.with(this).load(data.Poster).into(ivImagePoster)
}
}发布于 2021-12-29 17:40:30
我认为您得到了错误响应,这就是为什么response.body()是null的原因。您应该优雅地处理错误响应,而不是期望主体总是不为空,但这是另一回事。
我认为以下代码行是错误的:
interface OMDbApi {
@GET("t={Title}")
fun getMovieByTitle(@Path("Title") Title: String): Call<MovieList>
}“标题”应该是@Query参数,而不是@Path参数,因为API url中的&t=部件是查询参数。当它是一个查询参数时,您也不会将它指定为@GET路径的一部分。
然后,您的代码将变成:
interface OMDbApi {
@GET("")
fun getMovieByTitle(@Query("t") title: String): Call<MovieList>
}进行此更改,并查看是否仍收到错误响应。您可能需要在“Logcat”选项卡中检查日志,以查看从API返回的错误。
为此,您可能必须启用更高的日志记录级别。这是通过在构建Retrofit客户机时添加一个日志拦截器来完成的。
// Build a http client with logging enabled
val client = OkHttpClient.Builder()
.addInterceptor(HttpLoggingInterceptor().apply {
// you can also use Level.BODY for even more log information
level = HttpLoggingInterceptor.Level.BASIC
})
.build()
omdbapi = Retrofit.Builder()
.client(client) // add this line to use your http client
.baseUrl("http://www.omdbapi.com/?&apikey=eb73867f")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(OMDbApi::class.java);发布于 2021-12-29 18:11:19
以下代码解决了我的问题。
interface OMDbApi {
@GET("?apikey=[your api key]&")
fun getMovieByTitle(@Query("t") Title: String): Call<MovieList>
}https://stackoverflow.com/questions/70522132
复制相似问题