应用程序启动时的初始请求
Posted
技术标签:
【中文标题】应用程序启动时的初始请求【英文标题】:Initial requests at application start 【发布时间】:2022-01-24 01:18:51 【问题描述】:在应用程序启动时,我需要使用挂起函数(更具体地说,通过 okhttp 的 http 请求)获取一些全局常量数据。
目前这项任务的最佳做法是什么?
可以在何时何地提出请求?在哪里存储这些数据?如何从片段中访问它们?
【问题讨论】:
【参考方案1】:这个问题有很多。
什么时候?
您将在应用程序启动时执行此操作。为了简单起见,我会在活动创建后调用数据。在数据加载过程中,您可以显示加载屏幕。
在哪里?以及在哪里存储这些数据?
简单的答案应该在ViewModel 类中。它将在整个活动生命周期中存储数据。
如果您需要持久存储,请使用 Room 数据库。
如何从片段中访问它们?
您应该使用 ViewModel 类发出将在 Activity 的生命周期内保留数据的任何请求。如果 ViewModel 类在 Fragment 父 Activity 中启动,则可以从 Fragment 中引用 ViewModel 类。
这是一个 ViewModel 类的示例,其中调用了带有改造的数据(我删除了很多代码以保持简单。您需要查找如何正确实现网络连接,并将您的提供程序传递给带有ViewModelProvider)。
class MinecraftServerViewModel(val server: MinecraftServerRepository) : ViewModel()
val minecraftServerDetails = MutableLiveData<MinecraftServer>()
fun getMinecraftServerDetails(address: String)
val response = server.getMinecraftServerStatus(address)
response.enqueue(object : Callback<MinecraftServer>
override fun onResponse(call: Call<MinecraftServer>,response: Response<MinecraftServer>)
minecraftServerDetails.postValue(response.body())
override fun onFailure(call: Call<MinecraftServer>, t: Throwable)
)
调用完成后,我正在设置MutableLiveData,可以在Activity或Fragment中观察到。
下面是 ViewModel 在 Activity 和 Fragment 中的启动方式。
class MainActivity : AppCompatActivity()
private val retrofitService = ServiceMinecraftServer.getInstance()
private val viewModel: MinecraftServerViewModel by viewModels
MinecraftServerViewModelFactory(MinecraftServerRepository(retrofitService))
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
observerData()
private fun observerData()
viewModel.minecraftServerDetails.observe(this, serverResponse: MinecraftServer? ->
// Called everytime viewmodel data changes
// Do Something with data
// Dismiss loading and show fragment.
)
以下是在父活动中初始化时如何引用该视图模型和数据
class HomeFragment : Fragment(R.layout.fragment_home)
val viewModel: MinecraftServerViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
super.onViewCreated(view, savedInstanceState)
observeData()
private fun observeData()
viewModel.minecraftServerDetails.observe(viewLifecycleOwner, serverResponse: MinecraftServer? ->
// Called everytime viewmodel data changes
// Do something
)
只是获取内置 okhttp 的数据的快速示例。
这是我如何通过Retrofit 请求网络连接的示例
class MinecraftServerRepository constructor(private val service: ServiceMinecraftServer)
fun getMinecraftServerStatus(address: String) = service.getMinecraftServer(address)
/*
* Retrofit service to retrieve Minecraft server information
* Reference Site https://api.mcsrvstat.us/
*/
const val URL_MINECRAFT_SERVER = "https://api.mcsrvstat.us/2/"
interface ServiceMinecraftServer
@GET("address")
fun getMinecraftServer(@Path("address") address: String): Call<MinecraftServer>
companion object
var service: ServiceMinecraftServer? = null
fun getInstance(): ServiceMinecraftServer
if (service == null)
val retrofit = Retrofit.Builder()
.baseUrl(URL_MINECRAFT_SERVER)
.addConverterFactory(GsonConverterFactory.create())
.build()
service = retrofit.create(ServiceMinecraftServer::class.java)
return service!!
【讨论】:
以上是关于应用程序启动时的初始请求的主要内容,如果未能解决你的问题,请参考以下文章