应用程序启动时的初始请求

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!!
        
    

【讨论】:

以上是关于应用程序启动时的初始请求的主要内容,如果未能解决你的问题,请参考以下文章

iOS翻译App启动时的响应过程

IBM Worklight - 应用服务器启动时的初始化

UIWebView第一次请求太慢

从 cURL 请求时的 Paypal Adaptivepayments 问题

移除或更换启动时的 kivy 闪屏

iPhone 模拟器启动时的 EXC_BAD_ACCESS。应用程序在设备上运行