Как обработать обратный вызов метода со ссылками на пользовательский интерфейс после изменения конфигурации? - PullRequest
0 голосов
/ 26 марта 2020

Как я могу обработать обратный вызов после изменения конфигурации?

На самом деле, обратный вызов работает нормально. Но если обратный вызов вызывается после изменения конфигурации, он вызывает старую ссылку обратного вызова со старой ссылкой пользовательского интерфейса, поэтому он никогда не обновит мой текущий пользовательский интерфейс.

FINE: Call Api -> Api Response -> Успешный / исключительный обратный вызов -> Обновления пользовательского интерфейса

BAD: Call Api -> Изменение конфигурации -> Api Response -> Успешный / Исключение старый Обратный вызов - > Пользовательский интерфейс не обновляется

Api.kt

class Api {
    fun apiCall(successCallback: (statusCode: Int, json: JSONObject?) -> Unit,
        exceptionCallback: (e: Exception) -> Unit) {
        try {
            // Call API
            // ...
            // After API response:
            successCallback(statusCode, json)
        } catch (e) {
            exceptionCallback(e)
        }
    }
}

MyActivity.kt

class MyActivity : AppCompatActivity() {

    private lateinit var loading: View

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        loading = findViewById(R.id.loading)
    }

    fun someMethod() {
        loading.visibility =  = View.VISIBLE
        val api = Api()
        api.apiCall({ statusCode, json -> apiSuccessCallback(statusCode, json) },
            { e -> apiExceptionCallback(e) })
    }

    fun apiSuccessCallback(statusCode: Int, json: JSONObject?) {
        loading.visibility =  = View.GONE
        // Do something, go to another activity/fragment etc.
    }

    fun apiExceptionCallback(statusCode: Int, json: JSONObject?) {
        loading.visibility =  = View.GONE
        // Do something, show error message etc.
    }
}

Обходные пути, которые не кажутся такими хорошими:

1. onConfigurationChanged

Как и в Обратный вызов после изменения ориентации становится пустым , решение:

(...) вы можете инициализировать свои обратные вызовы в onConfigurationChanged

Почему я не хочу это делать, на Google words :

Внимание: Обработка Изменение конфигурации самостоятельно может значительно усложнить использование альтернативных ресурсов, поскольку система не применяет их автоматически для вас. Этот метод следует рассматривать как последнее средство, когда необходимо избегать перезапусков из-за изменения конфигурации, и не рекомендуется для большинства приложений.

2. сопутствующий объект

Возможно, лучше, чем onConfigurationChange, но все еще не совершенен.

Поскольку ссылка loading изменится на onCreate, она работает на моем bad вариант использования. Я не думаю, что это решение является хорошим, потому что этот обратный вызов не единственный, с которым у меня возникает эта проблема, поэтому я мог бы получить много companion objects для разных классов.

Во время некоторых исследований я пришел к выводу, что использование companion object приведет к утечке памяти :

Сопутствующий объект

(...) объявлен как класс Companion в JVM и создан как поле stati c внутри класса MyClass. Таким образом, не собирается g c

В Java / Android переменная или константа stati c не будут собираться мусором. (...) Чтобы избежать утечек памяти, вам просто не следует использовать переменные stati c.

...