仅一次启动一个线程

时间:2019-12-13 05:26:13

标签: android multithreading kotlin

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

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

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

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

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

当然可以获取仅启动一次线程的锁,但是由于Kotlin中对单例对象有很好的语法,所以这是一个相关的(我认为非常普遍)的问题,我开始相信那里可能是一种更简单,更优雅的方式。

还是获取对象锁定的首选方法?

2 个答案:

答案 0 :(得分:3)

您可以通过在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仅被调用一次。因此,在您的应用程序的整个生命周期中只有一个线程。

答案 1 :(得分:1)

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