android - 启动线程一次且仅一次
问题描述
我有一个单例对象,在应用程序运行时我将在其上执行一个线程。
到目前为止,我已经创建了线程MainActiviy::onCreate
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
thread{myobject.run()}
}
}
但与指向App 进程被杀死的箭头的文档相反,看起来每次重新启动应用程序时都会调用它,无论是否被杀死或其线程仍在运行。
onCreate()
onCreate()
object myobject{
fun run(){
while(true){
do_stuff()
}
}
}
当然可以获取一个锁来只启动线程一次,但是因为在 Kotlin 中有一个很好的语法用于单例对象,这是一个相关的(我假设很常见)问题,我开始相信可能会有一个更简单更优雅的方式。
或者是获取对象锁定的首选方式?
解决方案
您可以通过在 Application 类的 OnCreate 中启动线程来实现这一点。创建一个扩展 Application 类的类并将此类添加到清单中
我的应用程序.kt
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
thread{myobject.run()} //here
}
}
AndroidManifest.xml
<application
android:name=".com.yourpakage.MyApp"
android:label="@string/app_name"
...>
与活动生命周期不同,应用程序的 onCreate 只被调用一次。因此,在您的应用程序的整个生命周期中只有一个线程。
推荐阅读
- ios - 关于兴趣点点击的 Google Maps iOS 问题
- npm - Browserify 无法从 yyy 找到 xxx
- java - 如何初始化使用自定义类加载器动态加载的类?
- android - Android 剪辑到背景
- java - 如何将excel文件保存到java中的用户下载路径
- angular - 具有内部形式初始值的 Angular ControlValueAccessor
- php - 如何从任何字符串 php wordpress 中提取 url
- mysql - 不插入多于一条记录的触发器
- scala - 使用scala删除长字符串中的重复单词
- gulp - 如何使用 gulp-file-include 突出显示菜单中的活动链接?