我正在尝试编写一个基于电报的迷你应用程序。已连接 tdlib(用于向电报服务器发送请求的库)。来自电报服务器的所有响应都返回到从 Client.ResultHandler 继承的类的重写 onResult() 方法。
class TelegramResultHandler: Client.ResultHandler {
private val _authState = MutableLiveData<Authentication>()
val authState: LiveData<Authentication> get() = _authState
override fun onResult(data: TdApi.Object) {
when (data.constructor) {
TdApi.UpdateAuthorizationState.CONSTRUCTOR -> {
onAuthorizationStateUpdated((data as TdApi.UpdateAuthorizationState).authorizationState)
}
else -> Log.d(TAG, "Unhandled call: $data.")
}
}
private fun onAuthorizationStateUpdated(authorizationState: TdApi.AuthorizationState) {
when (authorizationState.constructor) {
TdApi.AuthorizationStateWaitTdlibParameters.CONSTRUCTOR -> {
Log.d(TAG, "onResult: AuthorizationStateWaitTdlibParameters")
}
TdApi.AuthorizationStateWaitEncryptionKey.CONSTRUCTOR -> {
Log.d(TAG, "onResult: AuthorizationStateWaitEncryptionKey")
}
TdApi.AuthorizationStateWaitPhoneNumber.CONSTRUCTOR -> {
Log.d(TAG, "onResult: AuthorizationStateWaitPhoneNumber")
}
TdApi.AuthorizationStateWaitCode.CONSTRUCTOR -> {
Log.d(TAG, "onResult: AuthorizationStateWaitCode")
authState.postValue(Authentication.WAIT_FOR_CODE)
}
TdApi.AuthorizationStateWaitPassword.CONSTRUCTOR -> {
Log.d(TAG, "onResult: AuthorizationStateWaitPassword")
authState.postValue(Authentication.WAIT_FOR_PASSWORD)
}
TdApi.AuthorizationStateReady.CONSTRUCTOR -> {
Log.d(TAG, "onResult: AuthorizationStateReady")
authState.postValue(Authentication.AUTHENTICATED)
}
TdApi.AuthorizationStateLoggingOut.CONSTRUCTOR -> {
Log.d(TAG, "onResult: AuthorizationStateLoggingOut")
}
TdApi.AuthorizationStateClosing.CONSTRUCTOR -> {
Log.d(TAG, "onResult: AuthorizationStateClosing")
}
TdApi.AuthorizationStateClosed.CONSTRUCTOR -> {
Log.d(TAG, "onResult: AuthorizationStateClosed")
}
else -> Log.d(TAG, "Unhandled authorizationState: $authorizationState.")
}
}
enum class Authentication {
UNAUTHENTICATED,
WAIT_FOR_NUMBER,
WAIT_FOR_CODE,
WAIT_FOR_PASSWORD,
AUTHENTICATED,
UNKNOWN
}
我无法将此数据传递给主线程进行显示。比如授权的时候,发送code之后,客户端可以登录或者请求云密码,但是这方面的信息只能在onResult()中获取,不能从那里传过来。
我尝试创建一个 MutableLiveData 类型的变量并使用 postValue() 方法发送数据,但在调试过程中,我注意到数据发生了变化,但订阅者没有任何反应。在一个片段中:
private val resultHandler = TelegramResultHandler()
resultHandler.authState.observe(viewLifecycleOwner){
when (it){
Authentication.WAIT_FOR_CODE -> {
showDialog("Enter confirmation code")
}
Authentication.WAIT_FOR_PASSWORD-> {
showDialog("Enter cloud password")
}
Authentication.AUTHENTICATED-> {
// request and display user data
}
else -> {
showDialog("Other")
}
}
}
如何将有关任何更改的数据传递给主线程以显示信息?