生命周期

  1. class MainActivity : AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_main)
  5. Log.i("hez", "初始化 Activity")
  6. }
  7. override fun onStart(){
  8. super.onStart()
  9. Log.i("hez", "加载完成")
  10. }
  11. override fun onResume(){
  12. super.onResume()
  13. Log.i("hez", "已经加载")
  14. }
  15. override fun onStop() {
  16. super.onStop()
  17. Log.i("hez", "停止程序")
  18. }
  19. }

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)