Вы также можете использовать жизненный цикл действия в BaseActivity
, чтобы каждый дочерний элемент Activity
выполнял ту же самую работу в своем обратном вызове жизненного цикла.Вам нужно post
ваш Runable
в onResume()
или onCreate()
из BaseActivity
и удалить его в onPause()
или onDestroy()
.См. Пример ниже:
BaseActivity
class BaseActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
val handlerBaseActivity = Handler()
val runnable = object : Runnable {
override fun run() {
Log.d("icepts","runnable from base...")
// TODO perform your repetitive operation
// call the handler again after 5 sec to perform above operation again
handlerBaseActivity.postDelayed(this, 5000)
}
}
override fun onResume() {
super.onResume()
handlerBaseActivity.postDelayed(runnable, 100)
}
override fun onPause() {
super.onPause()
handlerBaseActivity.removeCallbacks(runnable)
}
}
После этого вам не нужно вызывать функцию postDelayed()
вручную в каждом Activity
, который наследует BaseActivity
.Таким образом, чтобы MainActivity
сделал ту же операцию, которая написана в функции run()
в BaseActivity
, вы просто наследуете BaseActivity
.
class MainActivity : BaseActivity () {
// no need to declare local handler
override fun onCreate(savedInstanceState: Bundle?) {
...
// No need to call postDelayed() of localHandler as it's already called in BaseActiviy
}
// No need to remove callbacks in onPause() as it's already defined in BaseActivity
}
Update
Я хочуочистите ваше замешательство от следующего комментария:
Если я добавлю removeCallBacks в onPause BaseActivity, тогда runnable вообще не запустится, потому что onPause BaseActivity выполняется перед началом дочерней операции..
Если вы также зарегистрировали BaseActivity
в AndroidMannifest
и он работает как независимый Activity , удаление из него исполняемого файла не помешает ни одному ребенку выполнить ихработает на всех.По сути, все дети будут иметь свои собственные экземпляры runnable
s и handler
s, которые будут привязаны к их собственным жизненным циклам.