当前位置: 首页 > wzjs >正文

企业网站建设课程设计crm管理

企业网站建设课程设计,crm管理,页游开服表,网站优化具体是怎么做的文章目录 Android 倒计时总结Handler方案CountDownTimer方案Timer方案Flow方案总结源码下载 Android 倒计时总结 Handler方案 class MyHandler(private val intervalTime: Long, // 间隔private val totalTime: Long, // 总时长onTick: (Long) -> Unit, // 每秒回调onFini…

文章目录

  • Android 倒计时总结
    • Handler方案
    • CountDownTimer方案
    • Timer方案
    • Flow方案
    • 总结
    • 源码下载

Android 倒计时总结

Handler方案

class MyHandler(private val intervalTime: Long, // 间隔private val totalTime: Long, // 总时长onTick: (Long) -> Unit, // 每秒回调onFinish: () -> Unit // 结束回调
) {private var runType = RunType.INITprivate var handler: Handler? = Handler(Looper.getMainLooper())private val weekOnTick = WeakReference(onTick)private val weekOnFinish = WeakReference(onFinish)private var currentTime = 0Lprivate val runnable = object : Runnable {override fun run() {if (currentTime > 0) {// 进行中currentTime -= intervalTimeweekOnTick.get()?.invoke(currentTime)handler?.postDelayed(this, intervalTime)} else {// 结束weekOnFinish.get()?.invoke()runType = RunType.STOP}}}fun start() {if (runType == RunType.RUNNING) returnrunType = RunType.RUNNINGif (currentTime == 0L) {currentTime = totalTime}handler?.post(runnable)}fun pause() {if (runType != RunType.RUNNING) returnrunType = RunType.PAUSEhandler?.removeCallbacksAndMessages(null)}fun stop() {runType = RunType.STOPhandler?.removeCallbacksAndMessages(null)currentTime = 0weekOnFinish.get()?.invoke()}fun release() {runType = RunType.INIThandler?.removeCallbacksAndMessages(null)handler = nullweekOnTick.clear()weekOnFinish.clear()}enum class RunType {INIT, RUNNING, PAUSE, STOP}
}

使用:

class HandlerFragment : BaseFragment() {private lateinit var tvCountDown: TextViewprivate lateinit var btnStart: Buttonprivate lateinit var btnPause: Buttonprivate lateinit var btnStop: Buttoncompanion object {@JvmStaticfun newInstance() = HandlerFragment()}private lateinit var myHandler: MyHandleroverride fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View {return inflater.inflate(R.layout.fragment_handler, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)tvCountDown = view.findViewById(R.id.tv_count_down)btnStart = view.findViewById(R.id.btn_start)btnPause = view.findViewById(R.id.btn_pause)btnStop = view.findViewById(R.id.btn_stop)myHandler = MyHandler(1000L, 10_000L, { time ->tvCountDown.text = "剩余时间:${time / 1000}s"}, {tvCountDown.text = "倒计时结束!"})btnStart.setOnClickListener {myHandler.start()}btnPause.setOnClickListener {myHandler.pause()}btnStop.setOnClickListener {myHandler.stop()}}override fun onDestroyView() {super.onDestroyView()myHandler.release()}}

CountDownTimer方案

class MyCountDownTimer(private val intervalTime: Long,private val totalTime: Long,onTick: (Long) -> Unit,onFinish: () -> Unit
) {private var runType = RunType.INITprivate val weekOnTick = WeakReference(onTick)private val weekOnFinish = WeakReference(onFinish)private var countDownTimer: CountDownTimer? = nullfun start() {if (runType == RunType.RUNNING) returnrunType = RunType.RUNNINGcountDownTimer = object : CountDownTimer(totalTime, intervalTime) {override fun onTick(p0: Long) {weekOnTick.get()?.invoke(p0)}override fun onFinish() {weekOnFinish.get()?.invoke()runType = RunType.STOP}}countDownTimer!!.start()}fun stop() {runType = RunType.STOPcountDownTimer?.cancel()weekOnFinish.get()?.invoke()}fun release() {countDownTimer?.cancel()countDownTimer = nullweekOnTick.clear()weekOnFinish.clear()}enum class RunType {INIT, RUNNING, STOP}
}

使用:

class CountDownTimerFragment : BaseFragment() {private lateinit var tvCountDown: TextViewprivate lateinit var btnStart: Buttonprivate lateinit var btnStop: Buttonprivate lateinit var countDownTimer: MyCountDownTimercompanion object {@JvmStaticfun newInstance() = CountDownTimerFragment()}override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View {return inflater.inflate(R.layout.fragment_countdown_timer, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)tvCountDown = view.findViewById(R.id.tv_count_down)btnStart = view.findViewById(R.id.btn_start)btnStop = view.findViewById(R.id.btn_stop)countDownTimer = MyCountDownTimer(1000L, 10_000L,{ time ->tvCountDown.text = "剩余时间:${time / 1000}s"},{tvCountDown.text = "倒计时结束!"})btnStart.setOnClickListener {countDownTimer.start()}btnStop.setOnClickListener {countDownTimer.stop()}}override fun onDestroyView() {super.onDestroyView()countDownTimer.release()}
}

Timer方案

class MyTimer(private val intervalTime: Long,private val totalTime: Long,onTick: (Long) -> Unit,onFinish: () -> Unit
) {private val mainHandler = Handler(Looper.getMainLooper())private var runType = RunType.INITprivate val weekOnTick = WeakReference(onTick)private val weekOnFinish = WeakReference(onFinish)private var timer: Timer? = nullprivate var currentTime = 0Lfun start() {if (runType == RunType.RUNNING) returnrunType = RunType.RUNNINGcurrentTime = totalTimetimer = Timer()timer!!.schedule(object : TimerTask() {override fun run() {if (currentTime <= 0) {mainHandler.post {weekOnFinish.get()?.invoke()}cancel()runType = RunType.STOP} else {currentTime -= intervalTimemainHandler.post {weekOnTick.get()?.invoke(currentTime)}}}}, 0, intervalTime)}fun stop() {if (runType != RunType.RUNNING) returnrunType = RunType.STOPtimer?.cancel()weekOnFinish.get()?.invoke()}fun release() {timer?.cancel()timer = nullweekOnTick.clear()weekOnFinish.clear()}enum class RunType {INIT, RUNNING, STOP}
}

使用:

class TimerFragment : BaseFragment() {private lateinit var tvCountDown: TextViewprivate lateinit var btnStart: Buttonprivate lateinit var btnStop: Buttonprivate lateinit var myTimer: MyTimercompanion object {@JvmStaticfun newInstance() = TimerFragment()}override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View {return inflater.inflate(R.layout.fragment_timer, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)tvCountDown = view.findViewById(R.id.tv_count_down)btnStart = view.findViewById(R.id.btn_start)btnStop = view.findViewById(R.id.btn_stop)myTimer = MyTimer(1000L, 10_000L,{ time ->tvCountDown.text = "剩余时间:${time / 1000}s"},{tvCountDown.text = "倒计时结束!"})btnStart.setOnClickListener {myTimer.start()}btnStop.setOnClickListener {myTimer.stop()}}override fun onDestroyView() {super.onDestroyView()myTimer.release()}
}

Flow方案

class MyFlow(private val intervalTime: Long,private val totalTime: Long,private val onTick: (Long) -> Unit,private val onFinish: () -> Unit,private val scope: CoroutineScope
) {private var runType = RunType.INITprivate val weekOnTick = WeakReference(onTick)private val weekOnFinish = WeakReference(onFinish)private var job: Job? = nullprivate var currentTime = 0Lfun start() {if (runType == RunType.RUNNING) returnrunType = RunType.RUNNINGjob = scope.launch {flow {currentTime = totalTimewhile (currentTime >= 0) {emit(currentTime)delay(intervalTime)currentTime -= 1000}}.collect {weekOnTick.get()?.invoke(it)if (it <= 0) {weekOnFinish.get()?.invoke()runType = RunType.STOP}}}}fun stop() {if (runType != RunType.RUNNING) returnrunType = RunType.STOPjob?.cancel()weekOnFinish.get()?.invoke()}fun release() {job?.cancel()job = nullweekOnTick.clear()weekOnFinish.clear()}enum class RunType {INIT, RUNNING, STOP}
}

使用:

class FlowFragment : BaseFragment() {private lateinit var tvCountDown: TextViewprivate lateinit var btnStart: Buttonprivate lateinit var btnStop: Buttonprivate lateinit var myFlow: MyFlowcompanion object {@JvmStaticfun newInstance() = FlowFragment()}override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View {return inflater.inflate(R.layout.fragment_flow, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)tvCountDown = view.findViewById(R.id.tv_count_down)btnStart = view.findViewById(R.id.btn_start)btnStop = view.findViewById(R.id.btn_stop)myFlow = MyFlow(1000L, 10_000L,{ time ->tvCountDown.text = "剩余时间:${time / 1000}s"},{tvCountDown.text = "倒计时结束!"},lifecycleScope)btnStart.setOnClickListener {myFlow.start()}btnStop.setOnClickListener {myFlow.stop()}}override fun onDestroyView() {super.onDestroyView()myFlow.release()}
}

总结

  • 简单需求:优先选用CountDownTimer,避免重复造轮子

  • 界面交互:使用Handler时注意与View的生命周期绑定

  • 后台任务:Timer方案需配合Service使用

  • 新项目推荐:采用Kotlin Flow实现,搭配协程更高效

  • 性能关键:避免在倒计时回调中执行耗时操作

  • 内存优化:所有方案都需注意释放资源

源码下载


文章转载自:

http://BWQODCw1.snnkt.cn
http://y6Lkzhyi.snnkt.cn
http://EcJY0n8x.snnkt.cn
http://86IxI4Pd.snnkt.cn
http://q49cKunK.snnkt.cn
http://hBiLAjXJ.snnkt.cn
http://Z4VX4O4O.snnkt.cn
http://awR4rhTG.snnkt.cn
http://gtQXb3WT.snnkt.cn
http://eEsy16G1.snnkt.cn
http://WBNoSyUh.snnkt.cn
http://EjAyww6k.snnkt.cn
http://8DqsZHWp.snnkt.cn
http://179aYgBk.snnkt.cn
http://oFYljod6.snnkt.cn
http://MbUES3Tc.snnkt.cn
http://pQPEUkuM.snnkt.cn
http://MIrkxazu.snnkt.cn
http://rc6HxXil.snnkt.cn
http://3kk6vCyO.snnkt.cn
http://MdW9cFPz.snnkt.cn
http://65kaG47o.snnkt.cn
http://6wDN3AKy.snnkt.cn
http://avbFpuqR.snnkt.cn
http://gdtDg0n5.snnkt.cn
http://Ty1TteuL.snnkt.cn
http://B7KpZVVk.snnkt.cn
http://LzalFapB.snnkt.cn
http://YpUjH0G8.snnkt.cn
http://BdAz9xUk.snnkt.cn
http://www.dtcms.com/wzjs/620093.html

相关文章:

  • 我要建个网站做灯箱片的设计网站
  • 做网站去哪里网站后台管理系统展望
  • 网站建设报价明细单怎么咨询网络服务商
  • ae做动画教程网站每天免费体验6小时的云电脑
  • 网站开发团队人员配置山东住房城乡建设厅网站
  • 负责网站建设和网络推广的wordpress dux主题5.0
  • h5免费制作平台火蚁邀请函南京网站seo服务
  • 网站怎么做右上角消息提醒做网站的赚钱吗
  • 广东的网站建设企业网站建设的策略
  • 嘉兴学网站建设酷乐家居在线设计
  • 常州武进区建设局网站中文博客网站模板
  • 网站免费部署瑞安规划建设局网站
  • 山东企业建站系统信息黄骅港旅游攻略
  • 增加网站流量设计接单渠道
  • 怎么用微信做网站电商网站建设浩森宇特
  • 提供虚拟主机服务的网站网站建设的文档
  • 安徽省建设工程资料上传网站重庆做的好的房产网站好
  • 运城网站建设公司有多少网站loading动画
  • 怎么做企业网站推广需要多少钱seo站内优化
  • 河南网站建设找工作网络营销外包价格
  • 郑州做网站建设公司哪家好佛山网页设计怎么做
  • 网站建设有哪些分工分网上做分销代销哪个网站好
  • 什么是企业网站pv河北建设工程信息网一体化平台
  • 优秀高端网站建设报价html所有代码大全
  • 济南网站建设及推广在线文档 wordpress
  • 百度智能建站系统手机桌面布局设计软件
  • 厦门公司建站网络规划与设计报告总结
  • 网站建设 名词解释沈阳计算机培训机构
  • 长沙企业网站制作哪家好互联网推广服务
  • 网络营销就是建立企业网站手机网站开发流程