Как передать данные из объекта в содержащую его деятельность? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть служебный класс, используемый для получения токена с помощью вызова Retrofit. Я пытаюсь прослушать обратные вызовы методов этого класса в его активности.

В классе:

class TokenUtils() {

interface IGetTokenListener {

    fun onTokenRetreived(response: Boolean)
}

internal var callback: IGetTokenListener? = null


fun registerIGetTokenListener(callback: IGetTokenListener) {
    this.callback = callback
}

 private fun getToken() {



    val requestCall: Call<Token> = apiClass.getToken()


    requestCall.enqueue(object : Callback<Token> {
        override fun onFailure(call: Call<Token>, t: Throwable) {

        }

        override fun onResponse(call: Call<Token>, response: Response<Token>) {
            if (response.isSuccessful) {

                callback?.onTokenRetrieved(true)

            } 

        }

    })
}

Я пытаюсь прослушать обратный вызов с экземпляром этого класса в упражнении:

class MainActivity : AppCompatActivity() {

 var tokenUtils = TokenUtils()


 private fun getToken(requestBody) {

        tokenUtils.registerIGetTokenListener(object:TokenUtils.IGetTokenListener{
            override fun onTokenRetrieved(response: Boolean) {

                if (response){
                    AppLog.i(TAG, "onTokenRetrieved() - Token retrieved successfully")


                } else{
                    AppLog.i(TAG, "onTokenRetrieved() - Token retrieval failed")

                }
            }

        })

         tokenUtils.getToken()

}

А вот классвыполнение вызова:

interface ApiClass {

@POST("url")
fun getToken(
    @Body body: TokenRequest
): Call<Token>

}

Как я уже написал, обратные вызовы для IGetTokenListener не запускаются. Где мне нужно установить их так, чтобы они срабатывали при возврате вызова API в объекте TokenUtils?

1 Ответ

0 голосов
/ 01 ноября 2019

Я закончил тем, что превратил класс в синглтон и передал ему контекст следующим образом:

 companion object {

    private var instance: TokenUtils? = null

    fun getInstance(context: Context): TokenUtils {
        if (instance == null) {
            synchronized(TokenUtils::class.java) {
                if (instance == null)
                    instance = TokenUtils(context)
            }
        }
        return instance!!
    }
}

Я не понимаю, почему это работает, и предупреждение о задержке инициализации переменной экземпляра говорит мне, что передачаподобный контекст вызывает утечку памяти, но это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...