0

我正在尝试编写一个基于电报的迷你应用程序。已连接 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")
        }
    }
}

如何将有关任何更改的数据传递给主线程以显示信息?

4

0 回答 0