由于不活动而如何执行超时操作

问题描述 投票:0回答:1

假设我有一个要在一定时间后执行的动作,而用户没有触摸屏幕。如何实现一个计时器,该计时器在动作超时时会执行操作,但是每次用户触摸屏幕时都会重新开始?

android kotlin timeout
1个回答
0
投票

我搜索了几个答案,找不到像我想要的解决这个问题的方法那样简单的方法。这对我有用:

我使用了onUserInteraction()功能,该功能在用户每次触摸屏幕时都会调用。我声明了一个CountDownTimer,它从onCreate()开始,并在onDestroy()中取消。每次调用onUserInteraction()时,CountDownTimer都会被取消,重置并重新启动。 CountDownTimer完成后,将执行操作。

package com.example.inactivityapp

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.CountDownTimer
import android.util.Log
import android.widget.Toast

private val TAG = InactivityActivity::class.java.simpleName

private const val INACTIVITY_SECONDS: Int = 5

class InactivityActivity : AppCompatActivity() {

    var inactivitySeconds = INACTIVITY_SECONDS

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_inactivity)

        inactivityCountDownTimer.start()

    }

    override fun onDestroy() {
        super.onDestroy()
        inactivityCountDownTimer.cancel()
    }

    override fun onUserInteraction() {
        super.onUserInteraction()
        Log.i(TAG, "user interaction")
        inactivityCountDownTimer.cancel()
        inactivitySeconds = INACTIVITY_SECONDS
        inactivityCountDownTimer.start()
    }

    var inactivityCountDownTimer =
        object : CountDownTimer(inactivitySeconds * 1000.toLong(), 1000) {
            override fun onTick(millisUntilFinished: Long) {
                Log.i(TAG, inactivitySeconds.toString())
                inactivitySeconds--
            }

            override fun onFinish() {
                Toast.makeText(
                    this@InactivityActivity,
                    "Activity Timeout: Perform timeout task",
                    Toast.LENGTH_LONG
                ).show()
                Log.i(TAG, "activity timeout")
            }
        }
}

Output

© www.soinside.com 2019 - 2024. All rights reserved.