Kotlin - retrofit oddaje pusta liste po zapytaniu

Odpowiedz Nowy wątek
2020-02-29 16:09

Rejestracja: 7 miesięcy temu

Ostatnio: 4 tygodnie temu

0

Cześć,

Mam program, ktory wysyla zapytanie postem do API a nastepnie chcialbym utworzyc liste z wszystkimi danymi, ktore dostane w odpowiedzi, ale w momencie gdy wywoluje zapytanie do API to przy pierwszym wywolaniu dostaje pusta odpowiedz a w momencie gdy jeszcze raz ja odpale to zaczyna juz smigac. Czym jest to spowodowane?

class MainActivity : AppCompatActivity() {

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

        val api = ApiConnection()

        button_checkIfThisAccountExit_mainActivity.setOnClickListener {
            api.loginRequest(editText_login_activityMain.text.toString(), editText_password_mainActivity.text.toString())
            Log.v("parser", "result: " + api.data.size)
        }
    }
}
class ApiConnection {

    var baseApiURl = "http://localhost"
    var data = arrayListOf<User>()

    fun connectApi(): ApiService {
        Log.v("parser", "connectApi")
        val retrofit = Retrofit.Builder()
            .baseUrl(baseApiURl)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
        return retrofit.create(ApiService::class.java)

    }

    fun loginRequest(login: String, password: String): ArrayList<User>{

        Log.v("parser", "loginRequest")
        val service = connectApi()
        val call = service.login(login, password)
        call.enqueue(object: Callback<UserResponse> {
            override fun onFailure(call: Call<UserResponse>?, t: Throwable?) {
                Log.v("retrofit", "call failed")
            }

            override fun onResponse(call: Call<UserResponse>?, response: Response<UserResponse>?) {
                data.add(
                    User(
                        response!!.body()!!.idUser,
                        response!!.body()!!.login,
                        response!!.body()!!.password,
                        response!!.body()!!.name,
                        response!!.body()!!.surname,
                        response!!.body()!!.lastLogin
                    )
                )
            }
        })
        return data
    }
}

W momencie gdy po nacisnieciu przycisku i wywolaniu metody zapytania dlugosc listy jest rowna 0, ale gdy ponownie nacisne przycisk to zostaje dodane to co mialo byc dodane przy pierwszym wywolaniu tzn. jak naciskam to powinna byc lista rowna 1 a dostaje 0, nastepnie naciskajac znow dostaje liste rowna 1 zamiast rowna 2.
Czy jest to spowodowana biblioteka retrofit?

Pozostało 580 znaków

2020-02-29 17:13

Rejestracja: 2 lata temu

Ostatnio: 4 godziny temu

Jest to spowodowane tym, że kod w onResponse wykonuje się praktycznie zawsze po Log.v("parser", "result: " + api.data.size). Dzieje się tak, ponieważ klient HTTP, z którego korzysta Retrofit, wykonuje zapytanie na innym wątku niż główny wątek aplikacji i dopiero po jakimś czasie dostarcza odpowiedź na głównym wątku do obiektu przekazanego w enqueue().

edytowany 2x, ostatnio: Michał Sikora, 2020-02-29 17:14
Dzieki wielkie za pomoc :) Naprowadziles i dalem sobie rade - Szymon Markowski 2020-02-29 18:11

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0