在初始屏幕中重新连接的计时器任务



我有一些启动请求的启动画面,其中数据被加载到应用程序中。在启动这些初始屏幕请求之前,我想检查连接。这部分工作正常,但如果应用程序无法访问互联网,我想每 2 秒检查一次连接。如果建立了连接,我想取消Timer/TimerTask并在Timer调用下执行代码(隐藏重新连接进度条和文本并再次调用服务器 api(。但是如果我在下面运行此代码,应用程序将崩溃,而 Logcat 中没有任何可见的错误。但是我可以看到从计时器任务重新连接日志仍在运行。

我试图将api.splashScreen(this)hideReconnectViews()移动到 ReconnectCheck 类中并通过上下文调用它们,但会引发异常:

android.view.ViewRoot$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。

知道为什么我的解决方案不起作用吗?

初始屏幕活动中的代码:

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()
}

重新连接检查类:

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")
}
}
}

run 方法在与主线程不同的线程上执行。获取主线程并在那里更改您的视图。 @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")
}
}
}

这奏效了。

最新更新