首页 > 解决方案 > 避免来自底部导航快速点击的双重 API 调用

问题描述

我使用 Kotlin 开发了一个 Android 应用程序,所有结构和功能都很完整,但是当我反复快速点击时,我注意到一个小问题,至少两次在执行 API 调用的按钮上。

对于 API 调用,我使用 RetroFit2 和 GsonConverterFactory 的组合。调用如下:

    fun fetchInfo(id: Int) {
        val retrofit = Retrofit.Builder()
            .baseUrl("https://www.mysitesurl.com/api/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        val api = retrofit.create(ApiService::class.java)

        api.getInfo(id).enqueue(object: Callback<DataType> {

            override fun onResponse(call: Call<DataType>, response: Response<DataType>) {
                var resp = response.body()!!
                my_image.setImageResource(resources.getIdentifier(resp.image, "drawable", context!!.packageName))
                my_image.visibility = View.VISIBLE

                my_label.text = resp.text
                my_label.visibility = View.VISIBLE
            }

            override fun onFailure(call: Call<FechaDia>, t: Throwable) {

            }

        })
    }

我已经对代码进行了一些编辑以避免特定的变量名称

因此,如前所述,此代码工作正常,当我快速单击导航按钮两次时,问题就出现了。据我了解,它会在当前 API 响应并获得空响应之前尝试进行另一个 API 调用,所以我基本上尝试用空资源替换图像,它向我显示了这个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference`

我尝试使用 try/catch ,但它仍然进行调用并且仍然收到一个空请求。有没有办法阻止这种情况发生,或者我在这里的过程中遗漏了什么?

主要问题是它不仅显示错误,应用程序关闭并显示App has stopped. Open app again消息。

标签: androidkotlinnullpointerexceptiongsonretrofit2

解决方案


使用这样的全局标志:

private boolean clicked = false;

在点击:

if(false){
     callApi();
     clicked = true;
}

在 Success 或 Error 响应中,将其设为 false:

clicked = false;

推荐阅读