生命周期
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.i("hez", "初始化 Activity")
}
override fun onStart(){
super.onStart()
Log.i("hez", "加载完成")
}
override fun onResume(){
super.onResume()
Log.i("hez", "已经加载")
}
override fun onStop() {
super.onStop()
Log.i("hez", "停止程序")
}
}
viewBindin【数据绑定】
//build.gradle
viewBinding {
enabled = true
}
package com.example.appview
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.appview.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.hez.text = "hez 显示"
}
}
viewModel 【页面数据模型】
//build.gradle
apply plugin: 'kotlin-android-extensions'
//ViewModel.kt
package com.example.myapplication1
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import android.os.Handler
class HezViewModel:ViewModel() {
private val handler:Handler = Handler()
private val _hez = MutableLiveData<Int>().also {
it.value = 0
}
val hez:LiveData<Int> = _hez
fun setHez(){
_hez.value = _hez.value?.plus(1)
Log.i("hez", _hez.toString())
}
fun setHezOne() {
_hez.value = 0
}
fun ioHez(){
loadFruits()
}
/**
* 模拟网络请求,延迟2.5s
*/
private fun loadFruits(){
Log.i("hez","开始请求")
handler.postDelayed({
Log.i("hez","网络请求结束")
// 请求成功返回状态
_hez.value = 200
}, 2500)
}
}
//activity_main
package com.example.myapplication1
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.viewModels
import androidx.lifecycle.Observer
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main.view.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val model :HezViewModel by viewModels()
// 添加监听函数
model.hez.observe(this, Observer {
hez.text = it.toString()
})
button.setOnClickListener {
model.setHez()
}
button2.setOnClickListener {
model.setHezOne()
}
}
}
viewModel Fragme【组建数据模型】
//HezLiveData.kt
package com.example.myapplication1
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Observer
import com.example.myapplication1.databinding.FragmentBlankBinding
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [BlankFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class BlankFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
//viewMode
private val model: HezViewModel by activityViewModels()
//viewBind
private lateinit var binding: FragmentBlankBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
// return inflater.inflate(R.layout.fragment_blank, container, false)
binding = FragmentBlankBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// binding.fid.text = "测试数据11111"
binding.fid.textSize = 50f
binding.fid2.text = getString(R.string.app_name)
binding.button3.setOnClickListener{
// binding.fid.text = "点击事件"
// 调用viewMode的办法通信数据
model.ioHez()
}
//fragment 数据绑定
model.hez.observe(viewLifecycleOwner, Observer {
binding.fid.text = it.toString()
})
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment BlankFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
BlankFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
}
LiveData 【数据监听】
package com.example.livedartaapp
import android.util.Log
import androidx.lifecycle.LiveData
import java.util.concurrent.atomic.AtomicInteger
//数字类型LiveData
class HezLive: LiveData<AtomicInteger> (){
var atomicInteger:AtomicInteger = AtomicInteger(0)
override fun onActive() {
super.onActive()
Log.d(TAG, "onActive")
}
override fun onInactive() {
super.onInactive()
Log.d(TAG, "onInactive")
}
override fun setValue(value: AtomicInteger?) {
super.setValue(value)
Log.d(TAG, "$value")
}
fun updateValue(value: AtomicInteger?) {
value?.let {
it.incrementAndGet()
setValue(value)
}
}
companion object {
private val TAG = HezLive::class.java.simpleName
}
}
//字符串LiveData
class TextLiveData: LiveData<String>(){
val string:String = "朋友"
override fun onActive() {
super.onActive()
Log.d(TAG, "onActive")
}
override fun onInactive() {
super.onInactive()
Log.d(TAG, "onInactive")
}
fun updateValue(value: String?){
setValue(value)
Log.d(TAG, "更新数据")
}
companion object {
private val TAG = TextLiveData::class.java.simpleName
}
}
//MainActivity.kt
package com.example.livedartaapp
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.Observer
import com.example.livedartaapp.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
val data = HezLive()
val text= TextLiveData()
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.hez.text = text.string
binding.button.setOnClickListener {
text.updateValue("我来了")
// data.updateValue(data.atomicInteger)
}
text.observe(this, Observer {
// binding.hez.text = it.toString()
binding.hez.text = it.toString()
})
}
}
Room 【数据本地化】
//User.kt
package com.example.livedartaapp.db
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import java.util.*
@Entity
data class User(
@PrimaryKey val uid: Int,
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)
//UserDao.kt
package com.example.livedartaapp.db
import androidx.room.*
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
fun loadAllByIds(userIds: Int): List<User>
@Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
"last_name LIKE :last LIMIT 1")
fun findByName(first: String, last: String): User
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
}
//AppDatabase.kt
package com.example.livedartaapp.db
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
@Volatile
private var database: AppDatabase? = null
fun getInstance(context: Context): AppDatabase =
database ?: synchronized(this) {
database ?: buildDatabase(context).also{ database = it }
}
private fun buildDatabase(context: Context) =
Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java, "db")
.allowMainThreadQueries()
.build()
}
}
//连接使用数据库
private fun hezDb(){
val userDao = AppDatabase.getInstance(applicationContext).userDao()
val userList = userDao.getAll()
Log.i("db","Count=${userList.count()}")
//遍历数据查看
userList.forEach {
var msg = "id: ${it.uid}; name: ${it.firstName}; lastName:${it.lastName}"
Log.i("db",msg)
}
binding.button.setOnClickListener {
Log.i("db","点击添加数据")
text.updateValue("小垃圾")
//新建数据
// userDao.insertAll(User(113,"zz", "冬瓜"))
//通过id查询
// val userIdList = userDao.loadAllByIds(111)
// Log.i("db","id查询=${userIdList.count()}")
//通过内容查询
val userNameist = userDao.findByName("hez","靓仔")
Log.i("db","靓仔是:${userNameist.firstName}")
//
}
}
ROOM + LiveData 【数据本地监听】
//userDao.ky
package com.example.livedartaapp.db
import androidx.lifecycle.LiveData
import androidx.room.*
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): LiveData<List<User>>
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
fun loadAllByIds(userIds: Int): List<User>
@Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
"last_name LIKE :last LIMIT 1")
fun findByName(first: String, last: String): User
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
}
// 结合LiveData使用 感知数据变动
val observer = Observer<List<User>> { userList ->
Log.i("db","Count=${userList.count()}")
userList.forEach {
val msg = "$it (id=${it.uid})"
Log.i("db", msg)
}
userList.observe(this, observer)
2021-04-29 11:38:38.617 10911-10911/com.example.livedartaapp I/db: Count
2021-04-29 11:38:38.837 10911-10911/com.example.livedartaapp I/db: Count=8
2021-04-29 11:38:38.837 10911-10911/com.example.livedartaapp I/db: User(uid=10, firstName=hez, lastName=靓仔) (id=10)
2021-04-29 11:38:38.837 10911-10911/com.example.livedartaapp I/db: User(uid=11, firstName=hez, lastName=靓仔) (id=11)
2021-04-29 11:38:38.837 10911-10911/com.example.livedartaapp I/db: User(uid=111, firstName=hez, lastName=靓仔) (id=111)
2021-04-29 11:38:38.837 10911-10911/com.example.livedartaapp I/db: User(uid=112, firstName=hez1, lastName=靓仔1) (id=112)
2021-04-29 11:38:38.837 10911-10911/com.example.livedartaapp I/db: User(uid=113, firstName=zz, lastName=冬瓜) (id=113)
2021-04-29 11:38:38.837 10911-10911/com.example.livedartaapp I/db: User(uid=114, firstName=zz2, lastName=冬瓜) (id=114)
2021-04-29 11:38:38.837 10911-10911/com.example.livedartaapp I/db: User(uid=115, firstName=zz2, lastName=冬瓜) (id=115)
2021-04-29 11:38:38.838 10911-10911/com.example.livedartaapp I/db: User(uid=117, firstName=zz2, lastName=冬瓜) (id=117)
2021-04-29 11:38:51.617 10911-10911/com.example.livedartaapp I/db: 点击添加数据
2021-04-29 11:38:51.634 10911-10911/com.example.livedartaapp I/db: Count=9
2021-04-29 11:38:51.634 10911-10911/com.example.livedartaapp I/db: User(uid=10, firstName=hez, lastName=靓仔) (id=10)
2021-04-29 11:38:51.634 10911-10911/com.example.livedartaapp I/db: User(uid=11, firstName=hez, lastName=靓仔) (id=11)
2021-04-29 11:38:51.634 10911-10911/com.example.livedartaapp I/db: User(uid=14, firstName=hez, lastName=靓仔) (id=14)
2021-04-29 11:38:51.634 10911-10911/com.example.livedartaapp I/db: User(uid=111, firstName=hez, lastName=靓仔) (id=111)
2021-04-29 11:38:51.634 10911-10911/com.example.livedartaapp I/db: User(uid=112, firstName=hez1, lastName=靓仔1) (id=112)
2021-04-29 11:38:51.634 10911-10911/com.example.livedartaapp I/db: User(uid=113, firstName=zz, lastName=冬瓜) (id=113)
2021-04-29 11:38:51.634 10911-10911/com.example.livedartaapp I/db: User(uid=114, firstName=zz2, lastName=冬瓜) (id=114)
2021-04-29 11:38:51.634 10911-10911/com.example.livedartaapp I/db: User(uid=115, firstName=zz2, lastName=冬瓜) (id=115)
2021-04-29 11:38:51.634 10911-10911/com.example.livedartaapp I/db: User(uid=117, firstName=zz2, lastName=冬瓜) (id=117)