Il y a donc quelques éléments à considérer ici car il y a tellement de façons de dépouiller ce chat. Bien que toutes les réponses aient déjà été données sélectionnées et choisies. Je pense qu'il est important que cela soit revisité avec des directives de codage appropriées pour éviter que quiconque aille dans la mauvaise direction simplement à cause de la "réponse simple choisie par la majorité".
Alors d'abord, discutons de la réponse simple Post Delayed qui est la réponse sélectionnée par le gagnant dans l'ensemble de ce fil.
Quelques points à considérer. Après le délai de post-traitement, vous pouvez rencontrer des fuites de mémoire, des objets morts, des cycles de vie qui ont disparu, etc. Il est donc également important de le manipuler correctement. Vous pouvez le faire de deux manières.
Par souci de développement moderne, je fournirai en KOTLIN
Voici un exemple simple d'utilisation du thread d'interface utilisateur sur un rappel et de confirmation que votre activité est toujours bien vivante lorsque vous appuyez sur votre rappel.
Handler(Looper.getMainLooper()).postDelayed({
if(activity != null && activity?.isFinishing == false){
txtNewInfo.visibility = View.GONE
}
}, NEW_INFO_SHOW_TIMEOUT_MS)
Cependant, ce n'est toujours pas parfait car il n'y a aucune raison de frapper votre rappel si l'activité a disparu. donc une meilleure façon serait de garder une référence et de supprimer ses rappels comme celui-ci.
private fun showFacebookStylePlus1NewsFeedOnPushReceived(){
A35Log.v(TAG, "showFacebookStylePlus1NewsFeedOnPushReceived")
if(activity != null && activity?.isFinishing == false){
txtNewInfo.visibility = View.VISIBLE
mHandler.postDelayed({
if(activity != null && activity?.isFinishing == false){
txtNewInfo.visibility = View.GONE
}
}, NEW_INFO_SHOW_TIMEOUT_MS)
}
}
et bien sûr gérer le nettoyage sur le onPause afin qu'il ne frappe pas le rappel.
override fun onPause() {
super.onPause()
mHandler.removeCallbacks(null)
}
Maintenant que nous avons parlé de l'évidence, parlons d'une option plus propre avec les coroutines modernes et la kotlin :). Si vous ne les utilisez pas encore, vous en manquez vraiment.
fun doActionAfterDelay()
launch(UI) {
delay(MS_TO_DELAY)
actionToTake()
}
}
ou si vous voulez toujours faire un lancement d'interface utilisateur sur cette méthode, vous pouvez simplement faire:
fun doActionAfterDelay() = launch(UI){
delay(MS_TO_DELAY)
actionToTake()
}
Bien sûr, tout comme le PostDelayed, vous devez vous assurer de gérer l'annulation afin de pouvoir effectuer les vérifications d'activité après l'appel différé ou vous pouvez l'annuler dans la onPause, tout comme l'autre itinéraire.
var mDelayedJob: Job? = null
fun doActionAfterDelay()
mDelayedJob = launch(UI) {
try {
delay(MS_TO_DELAY)
actionToTake()
}catch(ex: JobCancellationException){
showFancyToast("Delayed Job canceled", true, FancyToast.ERROR, "Delayed Job canceled: ${ex.message}")
}
}
}
}
// gérer le nettoyage
override fun onPause() {
super.onPause()
if(mDelayedJob != null && mDelayedJob!!.isActive) {
A35Log.v(mClassTag, "canceling delayed job")
mDelayedJob?.cancel() //this should throw CancelationException in coroutine, you can catch and handle appropriately
}
}
Si vous placez le lancement (UI) dans la signature de méthode, le travail peut être attribué dans la ligne de code appelante.
La morale de l'histoire est donc d'être en sécurité avec vos actions retardées, assurez-vous de supprimer vos rappels ou d'annuler vos travaux et bien sûr de confirmer que vous avez le bon cycle de vie pour toucher les éléments de votre rappel différé. Les Coroutines proposent également des actions annulables.
Il convient également de noter que vous devez généralement gérer les diverses exceptions qui peuvent accompagner les coroutines. Par exemple, une annulation, une exception, un délai d'expiration, tout ce que vous décidez d'utiliser. Voici un exemple plus avancé si vous décidez de vraiment commencer à utiliser des coroutines.
mLoadJob = launch(UI){
try {
//Applies timeout
withTimeout(4000) {
//Moves to background thread
withContext(DefaultDispatcher) {
mDeviceModelList.addArrayList(SSDBHelper.getAllDevices())
}
}
//Continues after async with context above
showFancyToast("Loading complete", true, FancyToast.SUCCESS)
}catch(ex: JobCancellationException){
showFancyToast("Save canceled", true, FancyToast.ERROR, "Save canceled: ${ex.message}")
}catch (ex: TimeoutCancellationException) {
showFancyToast("Timed out saving, please try again or press back", true, FancyToast.ERROR, "Timed out saving to database: ${ex.message}")
}catch(ex: Exception){
showFancyToast("Error saving to database, please try again or press back", true, FancyToast.ERROR, "Error saving to database: ${ex.message}")
}
}