Retrofit отправляет несколько запросов

Рейтинг: 0Ответов: 1Опубликовано: 06.03.2023

Отправляю запросы через Retrofit. Проблема в том что с каждым последующим нажатием кнопки отправляются несколько запросов(1,3,4,5...). При смене активити сбрасывается до 1. Как сделать чтобы был 1?

object Retrofitinstance {
private val retrofit by lazy {
    val okHttpClient = OkHttpClient().newBuilder()
        .connectTimeout(180, TimeUnit.SECONDS)
        .readTimeout(180, TimeUnit.SECONDS)
        .writeTimeout(180, TimeUnit.SECONDS)
        .build()
    Retrofit.Builder()
        .baseUrl(base_url)
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
}
val api: SimpleApi by lazy {
    retrofit.create(SimpleApi::class.java)
}
}

.

interface SimpleApi {

@POST("/sdapi/v1/preprocess")
suspend fun pushPostPreproc(
    @Body post: preprocess
): Response<preprocess>
}

.

class MainViewModel(private val repository: Repository): ViewModel(){

var myResponsePreproc: MutableLiveData<Response<preprocess>> = MutableLiveData()

fun pushPostPreproc(post: preprocess){
    viewModelScope.launch {
        val response: Response<preprocess> = repository.pushPostPreproc(post)
        myResponsePreproc.value = response
    }
}
}

.

class Repository {

suspend fun pushPostPreproc(post: preprocess): Response<preprocess>{
    return Retrofitinstance.api.pushPostPreproc(post)
}

}

.

class MainViewModelFactory(
private val repository: Repository
) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return MainViewModel(repository) as T
  }
}

.

binding2.createHyperBtn.setOnClickListener {
        println("preprocess start")
        val repository = Repository()
        val vieModelFactory = MainViewModelFactory(repository)
        val myPostPreproc = preprocess(1, "images/$name","images/$name/out", 512, 512, "ignore", false, false, true)
        viewModel = ViewModelProvider(this, vieModelFactory).get(MainViewModel::class.java)
        viewModel.pushPostPreproc(myPostPreproc)
        viewModel.myResponsePreproc.observe(this, Observer { response ->
            if(response.isSuccessful){
                Log.d("Preprocess succesfull ", response.code().toString())

            } else{
                Log.d("Preprocess ERR", response.toString())

            }})

Log

I/System.out: preprocess start
D/NetworkSecurityConfig: No Network Security Config specified, using platform default
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
I/System.out: preprocess start
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
I/System.out: preprocess start
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
I/System.out: preprocess start
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}

Ответы

▲ 0Принят

Можешь решить эту проблему добавив отмену предыдущих запросов перед созданием нового нужно сохранять ссылку на объект запроса Retrofit и вызывать метод cancel() для отмены предыдущего запроса перед созданием нового.

class MyActivity : AppCompatActivity() {
    private var call: Call<MyResponse>? = null // сохраняем ссылку на объект запроса

    fun makeRequest() {
        call?.cancel() // отменяем предыдущий запрос
        val api = Retrofit.Builder()
            .baseUrl("https://example.com")
            .build()
            .create(MyApi::class.java)
        call = api.getMyData()
        call?.enqueue(object : Callback<MyResponse> {
            override fun onResponse(call: Call<MyResponse>, response: Response<MyResponse>) {
                // обработка ответа
            }

            override fun onFailure(call: Call<MyResponse>, t: Throwable) {
                // обработка ошибки
            }
        })
    }
}