Обработка Open Tok Session, Publisher, Subscriber при изменении конфигурации (поворот экрана из портретной в альбомную) - PullRequest
0 голосов
/ 05 апреля 2019

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

Проблема 1. Возможны ли эти вещи с помощью Open Tok (можно ли сохранить сессию, издателя и подписчика на изменениях ориентации)?

Проблема 2. Я не хочу воссоздавать сеанс с издателем и подписчиком. Как сохранить текущий сеанс, созданного издателя и подписчика при изменении ориентации активности?

Задача 3. Поскольку Open Tok предоставляет представление Android для издателя и подписчика, рекомендуется хранить их в памяти при изменении ориентации.

Задача 4. Когда я пытаюсь сделать это с фрагментом, где я устанавливаю "setRetainInstance (true);" После первого поворота экрана он работал нормально, но во второй раз выдал следующее исключение:

com.getvokl.android.GetVoklAPP E / ActivityThread: Activity com.getvokl.android.GetVoklAPP.framework.activity.CallFriendActivity произошла утечка IntentReceiver com.opentok.android.Session$20@d210317, который был первоначально зарегистрирован здесь. Вы пропускаете вызов unregisterReceiver ()?

Когда я проверял Это произошло в методе onResume () моего класса Fragment, где я упоминал session.onResume ().

1 Ответ

0 голосов
/ 03 мая 2019

Существует несколько вариантов сохранения объектов Opentok в цикле перезапуска активности.

Одной из опций может быть сохранение экземпляров в объекте, жизненный цикл которого отличается от действия.Вы также можете использовать статический экземпляр внутри Activity.Взгляните на этот пример Kotlin, используя сопутствующие объекты:

class OpenTokState {
    lateinit var s: Session
    lateinit var p: Publisher
    var initialized = false
}

class MainActivity : AppCompatActivity() {
    val API_KEY = ".."
    val TOKEN = "..."
    val SESSION_ID = "..."


    companion object {
        var opentok = OpenTokState()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        if (!opentok.initialized) {
            opentok.initialized = true
            opentok.s = Session.Builder(this, API_KEY, SESSION_ID).build()
        ...
    }
}

Сопутствующий объект является статическим экземпляром, который, как статическое средство, будет одинаковым во всех MainActivity экземплярах.

Обратите внимание, что если вы следуете этому подходу, вам нужно принять одно важное соображение: вам нужно , чтобы удалить представление издателя / подписчика у его родителей в методе действия onDestroy и снова добавить их представления вновые экземпляры контейнеров.

Существует еще одна альтернатива, но, как говорится в документации Android, это не предпочтительный способ.Этот другой метод - , обрабатывающий изменения конфигурации самостоятельно .В этом случае вы можете добавить android:configChanges="orientation" к объявлению своей активности в манифесте приложения, и тогда действие не будет перезапущено при изменении ориентации, поэтому экземпляры останутся живыми.

Однако вам придется самостоятельно обрабатывать оставшиеся изменения (например, изменения макета), что, вероятно, будет непростой задачей.

...