#java #android #kotlin
Пытаюсь перевести следующий код из java в kotlin:
private LGMThread lgmThread;
if (!lgmThread.isThreadStarted()) {
lgmThread.start();
} else {
lgmThread.openChannel();
}
Вместе с автоматическим конвертером кода Android Studio я перевела это в:
private var lgmThread: LGMThread? = null
if (!lgmThread.isThreadStarted()) {
lgmThread?.start()
} else {
lgmThread?.openChannel()
}
однако при этом AS ругается на выражение !lgmThread.isThreadStarted():
Я пробовала исправить это следующим образом:
lgmThread?.let {
if (!lgmThread.isThreadStarted()) {
lgmThread?.start()
} else {
lgmThread?.openChannel()
}
}
однако это не решает проблему:
И код
if (lgmThread != null) {
if (!lgmThread.isThreadStarted()) {
lgmThread?.start()
} else {
lgmThread?.openChannel()
}
}
приводит к точно такому же результату.
Код
if (!lgmThread?.isThreadStarted()) {
lgmThread?.start()
} else {
lgmThread?.openChannel()
}
также приводит к другой ошибке:
С оператором !!, конечно, ошибка исчезает:
if (!lgmThread!!.isThreadStarted()) {
lgmThread?.start()
} else {
lgmThread?.openChannel()
}
однако я не хочу использовать этот способ. Как правильно избавиться от этой ошибки,
не прибегая к оператору !!?
Ответы
Ответ 1
Так как lgmThread имеет тип LGMThread?, то и возвращаемое методом lgmThread?.isThreadStarted() значение будет иметь тип Boolean? В таком случае в блоке if вы можете проверять lgmThread?.isThreadStarted() на true, false и null Соответственно, кусок кода может выглядеть следующим образом: private var lgmThread: LGMThread? = null if (lgmThread?.isThreadStarted() == false) { lgmThread?.start() } else { lgmThread?.openChannel() } P.S. Но будьте внимательны, так как в таком случае код в блоке else выполнится при lgmThread?.isThreadStarted() равном true и nullОтвет 2
Ваша мысль с let была в верном направлении, только вы не изучили теорию как следует. Такое решение гораздо элегантнее. lgmThread?.let { if (!it.isThreadStarted()) { it.start() } else { it.openChannel() } } Или run lgmThread?.run { if (!isThreadStarted()) { start() } else { openChannel() } }
Комментариев нет:
Отправить комментарий