android - Kotlin 中改造回调的自定义实现
问题描述
我最近开始使用 Kotlin 进行我的 android 开发,并且遇到了一些小问题,通过使用文档我能够解决,但是使用 Retrofit Callback 实现我遇到了一个问题。我在 Java 中使用的 Retrofit 回调有一个自定义实现:
public abstract class RemoteCallback<T> implements Callback<T> {
@Override
public final void onResponse(Call<T> call, Response<T> response) {
switch (response.code()) {
case HttpsURLConnection.HTTP_OK:
case HttpsURLConnection.HTTP_CREATED:
case HttpsURLConnection.HTTP_ACCEPTED:
case HttpsURLConnection.HTTP_NOT_AUTHORITATIVE:
if (response.body() != null) {
onSuccess(response.body());
}
break;
case HttpURLConnection.HTTP_UNAUTHORIZED:
onUnauthorized();
break;
default:
onFailed(new Throwable("Default " + response.code() + " " + response.message()));
}
}
@Override
public final void onFailure(Call<T> call, Throwable t) {
onFailed(t);
}
public abstract void onSuccess(T responseBody);
public abstract void onUnauthorized();
public abstract void onFailed(Throwable throwable);}
我在 Kotlin 项目中使用了相同的类,它反过来将 java 代码转换为 kotlin 代码
abstract class RemoteCallback<T> : Callback<T> {
override fun onResponse(call: Call<T>, response: Response<T>) {
when (response.code()) {
HttpsURLConnection.HTTP_OK,
HttpsURLConnection.HTTP_CREATED,
HttpsURLConnection.HTTP_ACCEPTED,
HttpsURLConnection.HTTP_NOT_AUTHORITATIVE ->
if (response.body() != null)
onSuccess(response.body())
HttpURLConnection.HTTP_UNAUTHORIZED -> onUnauthorized()
else -> onFailed(Throwable("Default " + response.code() + " " + response.message()))
}
}
override fun onFailure(call: Call<T>, t: Throwable) {
onFailed(t)
}
abstract fun onSuccess(responseBody: T)
abstract fun onUnauthorized()
abstract fun onFailed(throwable: Throwable)}
问题是当我调用 onSucess(response.body()) 时,因为它说“智能转换为 'T' 是不可能的,因为 'response.body()' 是一个复杂的表达式” 请指导我如何解决它
解决方案
您正在向函数发送一个Nullable
值NonNull
作为参数。因此,您遇到了这个问题。你可以这样做:
interface RemoteCallback<T> : Callback<T> {
override fun onResponse(call: Call<T>?, response: Response<T>?) {
when (response?.code()) {
HttpsURLConnection.HTTP_OK,
HttpsURLConnection.HTTP_CREATED,
HttpsURLConnection.HTTP_ACCEPTED,
HttpsURLConnection.HTTP_NOT_AUTHORITATIVE ->
response.body()?.apply { onSuccess(this) }
HttpURLConnection.HTTP_UNAUTHORIZED -> onUnauthorized()
else -> onFailed(Throwable("Default " + response?.code() + " " + response?.message()))
}
}
override fun onFailure(call: Call<T>?, t: Throwable?) {
// handle error mechanism
t?.apply { onFailed(this) }
}
fun onSuccess(responseBody: T)
fun onUnauthorized()
fun onFailed(throwable: Throwable)
}
或者,您可以使用onSuccess(responseBody: T?)
并且您的代码应该可以工作
推荐阅读
- discord.js - 我无法通过discord js获取作者的头像
- ruby-on-rails - 如何从支架管理员的下拉列表中获取先前选择的值
- python-3.x - pandas long (very long + index) 到宽格式转换
- asp.net - How to convert the Absolute Uri path from .net to .net core?
- bash - 如何在 bash 命令的同一行中打印结果数据?
- powershell - PowerShell + Exchange Online - 使用 Where-Object 针对不同对象过滤一个对象?
- php - 查询生成器 update() codeigniter 4 没有更新我的密码
- android - Android Profiler:始终显示“此导入的跟踪没有可用的 cpu 使用数据”
- azure-active-directory - 如何使用图形 API 从 Azure AD B2C 读取用户名(DisplayUserPrincipalName)?
- javascript - 如何隐藏溢出内容?