TimerTask для переподключения на заставке
У меня есть splashScreen с некоторыми запросами на запуск, где данные загружаются в приложение. Прежде чем инициировать эти запросы splashScreen, я хочу проверить соединение. Эта часть работает нормально, но если приложение не имеет доступа к Интернету, я хочу проверять соединение каждые 2 секунды. Если соединение установлено, я хочу отменить Timer/TimerTask
и выполнить код под Timer
call (скрывает переподключение 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 ответ
Ваш метод запуска выполняется в другом потоке, чем основной поток. Получить основной поток и изменить свои взгляды там. 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")
}
}
}
Это сработало.