Итак, я пытался написать свою первую Kotlin Android библиотеку. Это обертка, которая (в теории) должна немного облегчить использование Network System Discovery. К go по поводу того, что происходит и что я пытаюсь сделать. Я абстрагирую большую часть кода и опущу его. Таким образом, встроенный NSD для androids требует много стандартного кода и слушателей, которые должны быть реализованы перед его использованием. Я попытался решить эту проблему, используя современные подходы и возможности Kotlins. Итак, теперь у меня есть класс NsdHelper, который вы создаете один раз и используете для регистрации, отмены регистрации, обнаружения служб и так далее. Это достигается благодаря наличию обертки вокруг списков, которые вызывают методы c в классе помощника.
Пример метода помощника
sName: String,
sType: String,
sPort: Int,
success: (NsdServiceInfo?) -> Unit,
failure: (Exception?) -> Unit
) {
val serviceInfo = NsdServiceInfo().apply {
serviceName = sName
serviceType = sType
port = sPort
}
registerSuccessCallBack = success
registerFailureCallBack = failure
mNsdManager.registerService(
serviceInfo,
NsdManager.PROTOCOL_DNS_SD,
registrationListener
)
}
Для регистрации службы вы передаете все необходимая информация вместе с лямбдами, которые будут выполнены в случае неудачи или успеха. Проблема возникает здесь, потому что я должен хранить обратные вызовы registerSuccessCallBack и registerFailureCallBack в классе. Итак, это выглядит так
class NsdKRegistrationListener(val nsdKelper: NsdKelper) : NsdManager.RegistrationListener{
companion object {
private const val ERROR_SOURCE = "android.net.nsd.NsdHelper.RegistrationListener"
}
override fun onUnregistrationFailed(serviceInfo: NsdServiceInfo?, errorCode: Int) {
Log.d("TAG", "UnRegistration failed $errorCode")
nsdKelper.unRegisterFailureCallBack?.invoke(UnRegistrationFailedException(errorCode.toString()))
}
override fun onServiceUnregistered(serviceInfo: NsdServiceInfo?) {
Log.d("TAG", "Unregistered service $serviceInfo")
nsdKelper.unRegisterSuccessCallBack?.invoke(serviceInfo)
}
Таким образом, они должны быть опубликованы c для доступа слушателей. Я подумал о 2 решениях, но не смог найти в Интернете никакой информации о том, как правильно подойти к этому. Во-первых, сделать слушатели внутренними классами, но это резко увеличит размер класса Helper, и это просто неправильно. Другое решение состояло в том, чтобы создать слушателей в вызове функции и передать обратные вызовы в их конструктор. Если у кого-то есть идея, я бы очень признателен за несколько советов или советов о том, как написать это правильно и почему так. Это была одна из самых сложных вещей, на которые я рассчитывал.