android - 避免来自底部导航快速点击的双重 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
消息。
解决方案
使用这样的全局标志:
private boolean clicked = false;
在点击:
if(false){
callApi();
clicked = true;
}
在 Success 或 Error 响应中,将其设为 false:
clicked = false;
推荐阅读
- python - 将 numpy digitize bin 列名匹配到输入列表
- typescript - 在进行开发工作时禁用 UglifyJSPlugin?
- python - Python Selenium 单击下一步按钮
- c++ - 在 C++ 上使用 Levensthein 算法创建多距离矩阵
- django - 在 Django 中清理用户输入
- javascript - 保存输入的自动刷新页面
- java - 拆分步骤定义
- laravel - Laravel Eloquent Eager Load with Sums
- python - python : 引用不同的 pip 目录
- git - 使用 Jenkins Pipeline 更改电子邮件 git