Как создать обработчик и запускаемый объект в Android Inherited Activity Class - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть наследуемый класс, который наследуют все мои действия.В этом классе Base / Parent Activity я хотел бы создать обработчик и Runnable Object, который запускается каждые 5 секунд во всех дочерних действиях без необходимости добавлять код в каждом дочернем действии.У меня это работает, когда Runnable Object находится в Inherited Activity, но я не могу обойтись без необходимости добавлять код для Handler в каждом дочернем Activity.

open class BaseActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
    val handlerBaseActivity = Handler()
    val runnable = object : Runnable {
        override fun run() {
            Log.d("icepts","runnable from base...")
        }
    }
class MainActivity : BaseActivity () {
    val handlerLocalActivity = Handler()

    override fun onCreate(savedInstanceState: Bundle?) {
    ...
    handlerLocalActivity.postDelayed(runnable, 100)
    }

   override fun onPause() {
        super.onPause()
        handlerBaseActivity.removeCallbacks(runnable)
    }

У всех естьидеи, которыми они хотели бы поделиться?Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Вы также можете использовать жизненный цикл действия в 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, которые будут привязаны к их собственным жизненным циклам.

0 голосов
/ 24 сентября 2019

Вы можете использовать поток для выполнения этой задачи.Я знаю, что в Kotlin у вас есть сопрограммы, которые дешевле создавать и которыми легче управлять, поэтому вы можете пойти по этому пути.Убедитесь, что вы создаете свой обработчик вне этого потока, поэтому при выполнении изменений пользовательского интерфейса вы не получите ошибок, однако, если вы хотите выполнять фоновые задачи, тогда вообще не используйте обработчик.Вы можете сохранить ссылку на этот поток, чтобы вы могли приостановить его, установив для параметра false значение false и прерывая его, а затем установив для него значение null, для хорошей меры, когда вы полностью перестанете его использовать.

fun loop() {
 handler.post(runnable) 
 //or 
 runOnUIThread(runnable)
 //background task
}
Thread(Runnable{
  while(running){
   loop()
   try{
   Thread.sleep(1000 * 5)
   }catch(e: InterruptedException){
   //some weird stuff happened
   }
  } 
}).start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...