在Kotlin中使用ViewModel,LiveData,Room和Retrofit结合使用的方法如下所示:
dependencies {
def lifecycle_version = "2.4.0"
def room_version = "2.4.0"
def retrofit_version = "2.9.0"
def coroutine_version = "1.5.2"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutine_version"
}
@Entity(tableName = "users")
data class User(
@PrimaryKey val id: Int,
val name: String,
val age: Int
)
@Dao
interface UserDao {
@Query("SELECT * FROM users")
fun getAllUsers(): LiveData>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertUser(user: User)
}
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
class UserRepository(private val userDao: UserDao) {
val allUsers: LiveData> = userDao.getAllUsers()
suspend fun insertUser(user: User) {
userDao.insertUser(user)
}
}
class UserViewModel(private val userRepository: UserRepository) : ViewModel() {
val allUsers: LiveData> = userRepository.allUsers
fun insertUser(user: User) {
viewModelScope.launch {
userRepository.insertUser(user)
}
}
}
interface UserService {
@GET("users")
suspend fun getUsers(): List
}
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.build()
val userService = retrofit.create(UserService::class.java)
class MainActivity : AppCompatActivity() {
private lateinit var userViewModel: UserViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val userDao = AppDatabase.getDatabase(application).userDao()
val userRepository = UserRepository(userDao)
userViewModel = ViewModelProvider(this, UserViewModelFactory(userRepository)).get(UserViewModel::class.java)
val adapter = UserAdapter()