在 Android 中使用 Kotlin 获取回调

Kar*_*kar 1 android kotlin

我是 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)

Cla*_*07g 5

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)

第二个大致相同。