首先,我知道如何创建Handler。
我正在做一个项目,我使用Handler
和postDelayed
。有些时候,应用程序会崩溃,因为activity被销毁,处理程序中的任务在activity销毁后执行。
我正在寻找一个处理程序,可以延迟后执行的替代品,它可能是生命周期意识,使应用程序不会崩溃。
我知道如何取消处理程序(在活动的onDestroy/onStop方法中删除处理程序或取消处理程序),这里是link。但我并不是在寻找这些解决方案。如果可以的话,任何替代方案都是更好的解决方案。
先谢谢你了!
4条答案
按热度按时间yk9xbfzb1#
根据你使用的是java还是Kotlin,你可以使用RxJava或协程来实现这个目标。
RxJava解决方案
Kotlin解决方案
正如你所看到的,Kotlin+协程解决方案需要更少的手动工作,而且更难出错,所以如果你在一个Kotlin项目上,我认为你应该使用它。其他的选择可能是使用Guava
ListenableFuture
s,但我还没有使用这些。jtjikinw2#
如果您使用
Handler
来执行postDelayed()
的延迟操作,则可能会在Activity或Fragment被销毁后执行操作时遇到麻烦。有一个简单的解决办法。将处理程序绑定到生命周期。
创建LifecycleObserver
首先让我们创建一个
LifecycleObserver
,它获取一个Handler
示例。在Lifecycle.Event.ON_DESTROY
的情况下,它将删除来自Handler
的所有回调和消息。将LifecycleObserver添加到LifecycleOwner中
接下来,我们必须将
LifecycleObververHandler
添加到LifecycleOwner
。我们还希望轻松创建这些生命周期观察处理程序。因此,让我们创建一个LifecycleHandlerFactory
。这个工厂是用lambda
handlerFactory
创建的,它提供了一个Handler
的示例(默认是带有主Looper的Handler
)。它有一个函数create
,它需要一个LifecycleOwner
。在该函数中,它检查
Lifecycle
的状态是否不是DESTROYED
。它调用handlerFactory
来获取Handler
的示例。然后它创建一个LifecycleObserverHandler
,它接受处理程序,并将Observer
添加到LifecycleOwner
。最后返回Handler
。注入生命周期感知的Handler
当您使用DependencyInjection Framework或像Koin这样的服务定位器时,您可以注入生命周期感知的
Handler
。最后,您可以在片段(或Activity)中注入生命周期处理程序。
ztigrdn83#
如果您熟悉并同意使用
coroutines
,则可以替换Handlers
以实现相同的功能使用以下与协程的依赖关系,您可以使协程的生命周期感知
然后在活动中
关于使用协程的更多信息:Deep Dive into Coroutines + Android
pcww981p4#
launchWhenResumed()现在被弃用了,现在的解决方案似乎是这样的:
你可以使用下面的小助手:
比如: