Android 线程学习(一)
/*
Service是Android中实现程序后台运行的解决方案,它非常适合执行那些不需要和后台交互,而且还要求长期运行的任务
Service的运行不依赖任何用户界面,即使程序被切换到后台
或者用户打开了另外一个应用程序,Service任然能够保持正常运行
Service并不是运行在一个独立的进程当中的,而是依赖于创建Service时所在的应用程序进程。当某个应用程序进程被杀掉时,
所有的依赖该进程的Service也会停止运行
实际上Service并不会自动开启线程,所有的代码都是默认运行在主线程当中,也就是说我们需要在Service内部手动创建子线程
并在这里执行具体的任务,否则就有可能出现主线程被阻塞的情况
多线程编程
当我们需要执行一些耗时操作比如发送一条网络请求,考虑到网速等原因,服务器未必能够立刻响应我们的请求,如果不将这类操作
放在子线程运行,就会导致主线程被阻塞
*/
class MainActivity : AppCompatActivity() {
private lateinit var change : Button
private lateinit var text : TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
change = findViewById(R.id.btn_change)
text = findViewById(R.id.tv_hello)
change.setOnClickListener {
/* thread {
text.text = "Nice to meet you"
}*/
Thread {
text.text = "Nice to meet you" //原本程序在子线程更新Ui操作也不会崩
//it.requestLayout() 加了这句程序会崩溃
it.invalidate() //加了这句就不会
}.start()
}
}
/*
实际上,就是只要你改view,不触发checkThread()就没事
而TextView的宽高不改变,也不会去触发requestLayout(),
修改背景也同样.不会触发view的位置大小改变.
当然.这种情况.不是每个版本的android都有用.
还是要规范的去主线程更新UI.哈哈
*/
/* class MyThread : Runnable {
override fun run() {
//编写具体的逻辑
}
}*/
}
/*
class MyThread : Thread() {
override fun run() {
super.run()
//编写具体的逻辑
}
}
MyThread().start()
//使用继承的方式耦合性有点高,会更多实现Runnable接口方式来定义一个线程
class MyThread : Runnable {
override fun run() {
//编写具体的逻辑
}
}
val mythread = MyThread()
Thread(mythread).start()
//不想专门在定义一个类去实现接口,也可以使用Lambda方式
Thread {
//编写具体的逻辑
}.start()
//Kotlin内置的顶层函数
thread {
//编写具体的逻辑
}
*/