Есть ли способ в Kotlin Retrofit, который работает эквивалентно OnPreExecute для Kotlin AsyncTask? - PullRequest
0 голосов
/ 29 мая 2020

У меня есть MainActivity.kt, служба вызова, предоставляемая классом NetworkConfig.kt (я новичок в разработке 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 выполнить задачу, когда приложение запрашивает службу на фон (например, показывает индикатор выполнения)? То, что работает эквивалентно функции AsyncTask onPreExecute .

Если что-то неясно, дайте мне знать.

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Очередь модернизации будет выполняться асинхронно

//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())
            }
        })
1 голос
/ 29 мая 2020

Перед вызовом в сеть вы можете установить для ProgressBar видимость View.VISIBLE, а затем в модификациях 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())
    }
})
...