TimerTask для переподключения на заставке - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть splashScreen с некоторыми запросами на запуск, когда данные загружаются в приложение. Прежде чем инициировать эти запросы splashScreen, я хочу проверить соединение. Эта часть работает нормально, но если приложение не имеет доступа к Интернету, я хочу проверять соединение каждые 2 секунды. Если соединение установлено, я хочу отменить Timer/TimerTask и выполнить код при вызове Timer (скрывая переподключение progressBar и Text и снова вызывая api сервера). Но если я запустите этот код ниже, приложение будет аварийно завершать работу без ошибок, видимых в Logcat. Но я вижу, что Reconnecting Log из TimerTask все еще работает.

Я пытался переместить api.splashScreen(this) и hideReconnectViews() в класс ReconnectCheck и вызывать их через контекст, но это исключение выброса:

android.view.ViewRoot $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может касаться его представлений.

Есть идеи, почему мое решение не работает?

Код в активности SplashScreen:

const val RECONNECT_TIME: Long = 2000

if(isOnline()){
            api.splashScreen(this)
        } else {
            showReconnectViews()
            val reconnectTimer = Timer()
            reconnectTimer.schedule(ReconnectCheck(this, reconnectTimer), 0, RECONNECT_TIME)
            createLog("ReconnectCheck ", "TimerFinished")
            api.splashScreen(this)
            hideReconnectViews()
        }

Класс ReconnectCheck:

class ReconnectCheck(val ctx: Context, val timer: Timer): TimerTask() {

    override fun run() {
        if ((ctx as Splash).isOnline()){
            timer.cancel()
            timer.purge()
        } else {
            Log.i("ReconnectCheck: ", "Reconnecting")
        }
    }
}

1 Ответ

0 голосов
/ 03 сентября 2018

Ваш метод запуска выполняется в другом потоке, чем основной поток. Получить основной поток и изменить свои взгляды там. @ JacksOnF1re

Код:

class ReconnectCheck(val ctx: Context, val timer: Timer): TimerTask() {
    private val api: API = API.getInstance(ctx)

    override fun run() {
        if ((ctx as Splash).isOnline()){
            ctx.runOnUiThread {
                ctx.hideReconnectViews()
                api.splashScreen(ctx)
            }
            timer.cancel()
            timer.purge()
        } else {
            Log.i("ReconnectCheck: ", "Reconnecting")
        }
    }
}

Это сработало.

...