【问题标题】:Start a thread once and only once启动线程一次且仅一次
【发布时间】:2019-12-13 05:26:13
【问题描述】:

我有一个单例对象,当应用程序运行时我将在其上执行一个线程。

到目前为止,我已经在MainActiviy::onCreate中创建了线程

class MainActivity : AppCompatActivity() {
   override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     thread{myobject.run()}
   }
}

但是与documentation 指向onCreate() 的箭头是App 进程被杀死相反,看起来onCreate() 在每次重新启动应用程序时都会被调用,无论是否被杀死或者它的线程是否仍在运行。

object myobject{
   fun run(){
      while(true){
         do_stuff()
      }
   }
}

当然可以获取一个锁来只启动线程一次,但是因为在 Kotlin 中有一个很好的语法用于单例对象,这是一个相关的(我认为很常见)问题,我开始相信可能存在可能是一种更简单更优雅的方式。

或者是获取对象锁定的首选方式?

【问题讨论】:

  • 我认为你应该在 Application 的 onCreate() 中启动你的线程,这样在你的应用程序的整个生命周期中只有一个线程
  • 这就是我正在做的事情,但是当用户离开并返回应用程序时会调用onCreate(),所以我得到了多个线程
  • 您在 onCreate 中执行此操作,我说在 Application 类的 onCreate 中执行 stackoverflow.com/questions/18002227/…
  • 请写下这个答案!

标签: android multithreading kotlin


【解决方案1】:

您可以通过在 Application 类的 OnCreate 中启动线程来实现此目的。创建一个扩展 Application 类的类并将此类添加到您的清单中

MyApp.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 只调用一次。因此,在您的应用的整个生命周期中只有一个线程。

【讨论】:

    【解决方案2】:

    您可以使用IntentService 并将状态存储在SharedPreference 上。 https://developer.android.com/training/run-background-service/create-service

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2016-02-02
    • 1970-01-01
    • 2020-12-13
    相关资源
    最近更新 更多