今天又是周末了,回顾这一周,我只要学习了第一行代码的Service这一章节的内容。
一、Service
在学习之前就知道Service作为安卓的四大组件之一,和activity一样有生命周期、有启动的方式,没有布局。但是对于service的具体用法我是不太清楚的。
首先,servise适用于那种不需要和用户交互,但是可以长期运行的任务,甚至于它所依赖的应用被切换到后台了,它还是在运行的。这就有关于他的生命周期了。
对于activity的生命周期,都接触的比较多,了解的也比较多。在Service中,主要调用的是onCreate()、onStartCommand()、onDestory()。当启动服务的时候onCreate()方法将被调用,如果service没有被创建的话、当service已经已经被创建的时候,调用的是onStartCommand(),service需要调用onDestory()销毁。onBind()方法可以使activity和service联系起来。
二、多线程
1.线程的使用,Kotlin
直接使用lanbda表达式
Thread{
}.start()
采用更简单的方式
thread{
}
2.在子线程更新ui
安卓中不允许在子线程操作ui,必须在主线程中操作,否则就会出现异常。为了解决这个问题,可以使用,异步消息处理机制。
例如使用handler 子线程更新ui
class MainActivity : AppCompatActivity() {
val updateText = 1
val handler = object : Handler(Looper.getMaininLooper()) {
override fun handleMessage(msg: Message) {
when (msg.what) {
updateText -> textView.text = "Nice to meet you"
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
changeTextBtn.setOnClickListener {
thread {
val msg = Message()
msg.what = updateText
handler.sendMessage(msg)
}
}
}
}
在这里主要使用了handle的几个主要方法,handleMessage、Message、handler.sendMessage(msg) ,首先获取Message()对象,msg.what赋值使用sendMessage()发送消息到消息队列中,最后在handleMessage()方法中,接受到消息,这样就可以实现在子线程中修改ui。
handler主要有message、handler、messagequeue、looper方法
message方法是用来线程传递消息,主要有what arg1 arg2 obj,arg1 主要用来传递整形数据,obj字段用来携带object对象。
handler 处理者主要用来发送和处理消息,使用sendMessage()、post()方法发送消息。最终会传递到Handler的handlemessage()方法中。
messagequeue是消息队列。
looper调用loop()方法,将messagequeue队列的数据传递到handlemessage。
三、泛型的使用
泛型的优点在于允许不指定类型的情况下编程,这样的代码将会拥有更好的扩展性。经常使用的List<Int>、List<String>就是使用了泛型,这种方式确实好用。
自己可以定义泛型类、泛型方法,但是在使用的时候,就要自己指定类型了。
比如class MyClass{
fun <T> method(a:T):T{
return a
}
}
method就是一个泛型方法,类型一般用T表示,他的使用是
val myClass=MyClass()
val a=myClass.method<Int>(123)
kotlin中的泛型还可以限制T的类型修改 fun <T:Number> method(a:T):T,就表示对于类型有了限制,只能是数字类型。