下面是详细讲解“Github简单易用的 Android ViewModel Retrofit框架”的完整攻略:
Github简单易用的 Android ViewModel Retrofit框架
简述
本文主要介绍如何使用Android中的ViewModel和Retrofit框架生成高效的网络操作和数据存储,使应用程序的数据请求和UI隔离开来,避免了常见的资源消耗和内存泄漏问题。
环境概述
- Android Studio: 4.0
- Gradle:6.1.1
- Kotlin:1.3.72
示例1: 使用ViewModel和Retrofit生成网络请求
- 首先在build.gradle中添加以下依赖项:
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
def retrofit_version = "2.7.2"
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
- 然后创建一个RESTful API服务类,比如:
interface ApiService {
@GET("/users/{id}")
fun getUser(@Path("id") id: Int): Call<User>
}
- 接下来创建一个模型类(在这个示例中是User类):
data class User(val id: Int, val name: String, val email: String)
- 然后创建一个具有ViewModel的Activity或Fragment:
class MainActivity : AppCompatActivity() {
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
val userObserver = Observer<User> { user ->
// 界面更新代码
}
viewModel.getUser(0).observe(this, userObserver)
}
}
- 最后创建ViewModel类,用于存储API服务实例:
class MainViewModel : ViewModel() {
private val apiService by lazy {
Retrofit.Builder()
.baseUrl("https://api.example.com")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
fun getUser(id: Int) : LiveData<User> {
val data = MutableLiveData<User>()
apiService.getUser(id).enqueue(object : Callback<User> {
override fun onResponse(call: Call<User>, response: Response<User>) {
if (response.isSuccessful) {
response.body()?.let {
data.value = it
}
}
}
override fun onFailure(call: Call<User>, t: Throwable) {
Log.e("MainViewModel", t?.message)
}
})
return data
}
}
这样就可以在Activity或Fragment中使用ViewModel和Retrofit,来发送一个网络请求并且展示结果了。
示例2: 使用ViewModel和Retrofit更新RecyclerView
- 创建一个具有ViewModel的Activity或Fragment:
class MainActivity : AppCompatActivity() {
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val adapter = UserAdapter()
rv_users.adapter = adapter
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
viewModel.getUsers().observe(this, Observer<List<User>> { users ->
adapter.submitList(users)
})
}
}
- 然后创建一个模型类(在这个示例中是User类):
data class User(val id: Int, val name: String, val email: String)
- 接着,创建一个RESTful API服务类,比如:
interface ApiService {
@GET("/users")
fun getUsers(): Call<List<User>>
}
- 最后创建ViewModel类,用于存储API服务实例:
class MainViewModel : ViewModel() {
private val apiService by lazy {
Retrofit.Builder()
.baseUrl("https://api.example.com")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
fun getUsers() : LiveData<List<User>> {
val data = MutableLiveData<List<User>>()
apiService.getUsers().enqueue(object : Callback<List<User>> {
override fun onResponse(call: Call<List<User>>, response: Response<List<User>>) {
if (response.isSuccessful) {
response.body()?.let {
data.value = it
}
}
}
override fun onFailure(call: Call<List<User>>, t: Throwable) {
Log.e("MainViewModel", t?.message)
}
})
return data
}
}
这样我们就可以使用ViewModel和Retrofit来更新RecyclerView展示列表数据。
结论
使用ViewModel和Retrofit来完成Android应用程序中的网络请求和数据存储,能够解决常见的资源开销和内存泄漏问题。在此攻略中我们已经详细讲解了如何使用它们,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Github简单易用的 Android ViewModel Retrofit框架 - Python技术站