Пытаюсь перевести следующий код из 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()
}
однако я не хочу использовать этот способ. Как правильно избавиться от этой ошибки, не прибегая к оператору !!?
Ответ
Так как 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
Комментариев нет:
Отправить комментарий