Kotlin Retrofit 中是否有一种方法与 Kotlin AsyncTask 的 OnPreExecute 等效?

Is there a way in Kotlin Retrofit that works equivalent as OnPreExecute of Kotlin AsyncTask?

我有一个MainActivity.ktNetworkConfig.ktclass提供的呼叫服务(我是Android开发的初学者)。

MainActivity.kt

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        NetworkConfig().getService()
            .getUsers()
            .enqueue(object : Callback<List<UserDataClassItem>> {

                override fun onFailure(call: Call<List<UserDataClassItem>>, t: Throwable) {
                    Toast.makeText(this@MainActivity, "No Connection. Check your Connectivity", Toast.LENGTH_SHORT).show()
                }

                override fun onResponse(
                    call: Call<List<UserDataClassItem>>,
                    response: Response<List<UserDataClassItem>>
                ) {
                    rvUser.adapter = UserAdapter(response.body())
                }
            })
    }
}

NetworkConfig.kt

class NetworkConfig {
    // set interceptor
    private fun getInterceptor() : OkHttpClient {
        val logging = HttpLoggingInterceptor()
        logging.level = HttpLoggingInterceptor.Level.BODY

        return OkHttpClient.Builder()
            .addInterceptor(logging)
            .build()
    }

    private fun getRetrofit() : Retrofit {
        return Retrofit.Builder()
            .baseUrl("https://jsonplaceholder.typicode.com/")
            .client(getInterceptor())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    fun getService() = getRetrofit().create(Users::class.java)
}


//Access https://jsonplaceholder.typicode.com/users
interface Users {
    @GET("users")
    fun getUsers(): Call<List<UserDataClassItem>>
}

我想知道Retrofit有没有办法在App在后台获取服务时执行任务(比如显示进度条)? 与 AsyncTask 的 onPreExecute 函数等效的东西。

如果有任何不清楚的地方,请告诉我。

在您的网络调用之前,您可以将 ProgressBar 可见性设置为 View.VISIBLE,然后在 Retrofit 的 onResponse()onFailure() 中,将其可见性设置为 View.GONE.

像这样:

progressbar.visibility = View.VISIBLE
NetworkConfig().getService()
.getUsers()
.enqueue(object : Callback<List<UserDataClassItem>> {

    override fun onFailure(call: Call<List<UserDataClassItem>>, t: Throwable) {
        progressbar.visibility = View.GONE
        Toast.makeText(this@MainActivity, "No Connection. Check your Connectivity", Toast.LENGTH_SHORT).show()
    }

    override fun onResponse(
        call: Call<List<UserDataClassItem>>,
        response: Response<List<UserDataClassItem>>
    ) {
        progressbar.visibility = View.GONE
        rvUser.adapter = UserAdapter(response.body())
    }
})

改造入队将以异步方式执行

//You could show progress bar here
NetworkConfig().getService()
        .getUsers()
        .enqueue(object : Callback<List<UserDataClassItem>> {

            override fun onFailure(call: Call<List<UserDataClassItem>>, t: Throwable) {
//You could hide progressBar here
                Toast.makeText(this@MainActivity, "No Connection. Check your Connectivity", Toast.LENGTH_SHORT).show()
            }

            override fun onResponse(
                call: Call<List<UserDataClassItem>>,
                response: Response<List<UserDataClassItem>>
            ) {
               //You could hide progressBar here
                rvUser.adapter = UserAdapter(response.body())
            }
        })