#java #android #kotlin #service
#java #Android #kotlin #Обслуживание
Вопрос:
У меня есть a Service
, который действует как TimerTask
и, даже если я остановлю службу с помощью :
val intent = Intent(applicationContext, TimeService::class.java)
stopService(intent)
Это не останавливается, у меня есть Log
onDestroy
вход, и это Log
запускается… но я думаю, что проблема в том, что я использую TimerTask
внутри Service
это мой Service
class TimeService : Service() {
private val mHandler = Handler()
var calendar: Calendar? = null
var simpleDateFormat: SimpleDateFormat? = null
var strDate: String? = null
var date_current: Date? = null
var date_diff: Date? = null
private var mTimer: Timer? = null
private val NOTIFY_INTERVAL: Long = 1000
var intent: Intent? = null
companion object {
val str_receiver = "myreceiver"
}
override fun onBind(intent: Intent): IBinder? {
return null
}
override fun onCreate() {
super.onCreate()
calendar = Calendar.getInstance()
simpleDateFormat = SimpleDateFormat("HH:mm:ss", Locale.getDefault())
mTimer = Timer()
mTimer!!.scheduleAtFixedRate(TimeDisplayTimerTask(), 5, NOTIFY_INTERVAL)
intent = Intent(str_receiver)
}
internal inner class TimeDisplayTimerTask : TimerTask() {
override fun run() {
mHandler.post {
calendar = Calendar.getInstance()
simpleDateFormat = SimpleDateFormat("HH:mm:ss", Locale.getDefault())
strDate = simpleDateFormat!!.format(calendar!!.time)
Log.e("strDate", strDate)
twoDatesBetweenTime()
}
}
}
fun twoDatesBetweenTime(): String {
try {
date_current = simpleDateFormat!!.parse(strDate)
} catch (e: Exception) {
}
try {
date_diff = simpleDateFormat!!.parse(SharedPreferenceHelper.defaultPrefs(this).getString("data", ""))
} catch (e: Exception) {
}
try {
val diff = date_current!!.time - date_diff!!.time
val timeInSeconds = Integer.valueOf(SharedPreferenceHelper.defaultPrefs(this).getString("seconds", "")!!)
val timeTimer = TimeUnit.SECONDS.toMillis(timeInSeconds.toLong())
val diffWithTime = timeTimer - diff
val diffSeconds2 = diffWithTime / 1000 % 60
val diffMinutes2 = diffWithTime / (60 * 1000) % 60
val diffHours2 = diffWithTime / (60 * 60 * 1000) % 24
if (diffWithTime >= 0) {
val counterTime = "$diffHours2 : $diffMinutes2 : $diffSeconds2"
Log.e("TIME", counterTime)
fn_update(counterTime)
} else {
SharedPreferenceHelper.defaultPrefs(this).edit().putBoolean("finish", true).apply()
mTimer!!.cancel()
}
} catch (e: Exception) {
mTimer!!.cancel()
mTimer!!.purge()
}
return ""
}
override fun onDestroy() {
super.onDestroy()
Log.e("Service finish", "Finish")
}
private fun fn_update(str_time: String) {
intent!!.putExtra("time", str_time)
sendBroadcast(intent)
}
}
И проблема в том, что этот журнал :
Log.e("strDate", strDate)
И этот журнал :
Log.e("TIME", counterTime)
Никогда не останавливается, чего мне не хватает?
Редактировать
Мой подход таков с момента, но я не знаю, лучший ли это способ :
override fun onDestroy() {
super.onDestroy()
Log.e("Service finish", "Finish")
if(mTimer!=null){
mTimer!!.cancel()
mTimer!!.purge()
}
}
Ответ №1:
OnDestroy
это метод обратного вызова, вызываемый системой, чтобы разрешить вашей службе «чистый выход»:
Вызывается системой для уведомления Службы о том, что она больше не используется и удаляется. На данный момент служба должна очистить все ресурсы, которые она содержит (потоки, зарегистрированные получатели и т. Д.). По возвращении больше не будет вызовов к этому объекту службы, и он фактически мертв. Не вызывайте этот метод напрямую.
Система не завершает процесс вашего приложения мгновенно после этого обратного вызова. На данный момент вам решать, чтобы отключить TimerTask
его. Если вы оставите его запущенным, это считается утечкой. Скорее всего, он будет продолжать работать до тех пор, пока система не решит, что пришло время завершить процесс ваших приложений, что может занять некоторое время, если он находится на переднем плане.
Комментарии:
1. @StuartDTO выглядит нормально, но вам следует подумать о том, чтобы изменить свой
mTimer
,calendar
иsimpleDateFormat
lateinit var
вместо того, чтобы выполнять грязные, не нулевые приведения (!!
), тщательно изучите свой код.2. Спасибо за совет 😉