Получение обратного вызова в Kotlin в Android - PullRequest
0 голосов
/ 17 февраля 2020

Я новичок ie в Kotlin и хочу изучать лямбда-функции. Я изучаю Android уже несколько месяцев. и я хотел объединить Kotlin и Andriod, поэтому для практики я пытаюсь преобразовать код Java в Kotlin. Я сталкиваюсь с проблемой при получении обратных вызовов. Приведенный ниже код требует обратного вызова, которого я не могу выполнить.

Я не упомянул, что интерфейс ReservoirPutCallback закодирован в Java и находится в режиме только для чтения

Вот mycode (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;
    }

1 Ответ

3 голосов
/ 17 февраля 2020

Kotlin поддерживает то, что вы пытаетесь сделать. Вы фактически передаете полный объект в качестве параметра, а не просто обратный вызов. Если бы это была одна функция обратного вызова, вы могли бы использовать лямбду, но это больше похоже на «объект обратного вызова».

Для этого мы используем анонимные объекты , а не лямбда-функции / функции. Это верно как для 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")
        }
    }
)

Второй примерно одинаков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...