我是 Kotlin 的新手,想学习 Lambda 函数。我已经学习 Android 几个月了。并且想要集成 Kotlin 和 Andriod ,因此为了练习,我尝试将 Java 代码转换为 Kotlin。我在收到回电时遇到麻烦。下面的代码需要一个我无法实现的回调。
我没有提到ReservoirPutCallback接口是用Java编码的并且处于只读模式
这是我的代码(Java),我在其中遇到错误:-
if(DISK_CACHE_INITIALIZED){
Reservoir.putAsync(Constants.SCIENTISTS_CACHE_KEY, scientists,
**new ReservoirPutCallback()** {
@Override
public void onSuccess() {
//success
DISK_CACHE_DIRTY = false;
}
@Override
public void onFailure(Exception e) {
Log.e("CAMPOSHA","PUTTING CACHE TO DISK FAILED");
}
});
}
}
public static LiveData<List<Scientist>> bindFromDiskCacheAsync(){
MutableLiveData<List<Scientist>> scientistLiveData=new MutableLiveData<>();
if(!DISK_CACHE_INITIALIZED){
return null;
}
**Type resultType = new TypeToken<List<Scientist>>() {}.getType()**;
Reservoir.getAsync(Constants.SCIENTISTS_CACHE_KEY, resultType,
new ReservoirGetCallback<List<Scientist>>() {
@Override
public void onSuccess(List<Scientist> scientists) {
scientistLiveData.setValue(scientists);
}
@Override
public void onFailure(Exception e) {
Log.e("CAMPOSHA","ASYNC REFRESH FROM DISK FAILED");
scientistLiveData.setValue(null);
}
});
return scientistLiveData;
}
Run Code Online (Sandbox Code Playgroud)
Kotlin 支持您正在尝试做的事情。您实际上是传递一个完整的对象作为参数,而不仅仅是回调。如果它是单个回调函数,您可以使用 lambda,但这更像是“回调对象”。
为此,我们使用匿名对象而不是 lambda/函数。对于 java 和 kotlin 都是如此。
第一个回调将如下所示:
Reservoir.putAsync(Constants.SCIENTISTS_CACHE_KEY, scientists,
object : ReservoirPutCallback {
override fun onSuccess() {
//success
DISK_CACHE_DIRTY = false
}
override fun onFailure(e: Exception) {
Log.e("CAMPOSHA","PUTTING CACHE TO DISK FAILED")
}
}
)
Run Code Online (Sandbox Code Playgroud)
第二个大致相同。
| 归档时间: |
|
| 查看次数: |
3148 次 |
| 最近记录: |