首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OMDb Api没有显示任何结果- Kotlin,Android

OMDb Api没有显示任何结果- Kotlin,Android
EN

Stack Overflow用户
提问于 2021-12-29 16:22:18
回答 2查看 225关注 0票数 1

我一步一步地仔细观察每件事,但我找不到问题所在。每当我填写我要搜索的电影的名称时,应用程序就会崩溃,它说: java.lang.NullPointerException: response.body()不能为null

有人知道吗?下面是下面的代码。

MovieList.kt

代码语言:javascript
复制
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

代码语言:javascript
复制
interface OMDbApi {
    @GET("t={Title}")
    fun getMovieByTitle(@Path("Title") Title: String): Call<MovieList>
}

OMDbApiClient.kt

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
    }


}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-29 17:40:30

我认为您得到了错误响应,这就是为什么response.body()null的原因。您应该优雅地处理错误响应,而不是期望主体总是不为空,但这是另一回事。

我认为以下代码行是错误的:

代码语言:javascript
复制
interface OMDbApi {
    @GET("t={Title}")
    fun getMovieByTitle(@Path("Title") Title: String): Call<MovieList>
}

“标题”应该是@Query参数,而不是@Path参数,因为API url中的&t=部件是查询参数。当它是一个查询参数时,您也不会将它指定为@GET路径的一部分。

然后,您的代码将变成:

代码语言:javascript
复制
interface OMDbApi {
    @GET("")
    fun getMovieByTitle(@Query("t") title: String): Call<MovieList>
}

进行此更改,并查看是否仍收到错误响应。您可能需要在“Logcat”选项卡中检查日志,以查看从API返回的错误。

为此,您可能必须启用更高的日志记录级别。这是通过在构建Retrofit客户机时添加一个日志拦截器来完成的。

代码语言:javascript
复制
    // 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);
票数 1
EN

Stack Overflow用户

发布于 2021-12-29 18:11:19

以下代码解决了我的问题。

代码语言:javascript
复制
interface OMDbApi {
    @GET("?apikey=[your api key]&")
    fun getMovieByTitle(@Query("t") Title: String): Call<MovieList>
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70522132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档