0

I am new with MVVM in kotlin, I want to fetch some data using retrofit and show this in textview but I can't fetch this. In this app first time, I am using the android jetpack component. I tried a lot of times but I can't solve this error. My code in below

MainActivity.kt

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

    val repository = Repository()
    val viewModelFactory = MainViewModelFactory(repository)
    viewModel = ViewModelProvider(this, viewModelFactory).get(MainViewModel::class.java)
    viewModel.getEmployeeData()

    viewModel.repoResponse.observe(this, Observer { response ->
        if (response.isSuccessful) {
            Log.d("Response", response.body()?.employee_id.toString())
            Log.d("Response", response.body()?.employee_name.toString())
            Log.d("Response", response.body()?.employee_age.toString())
            Log.d("Response", response.body()?.employee_salary.toString())

            name.text = response.body()?.employee_name!!

        } else {
            Log.d("Response", response.errorBody().toString())
            name.text = response.code().toString()
        }
    })
}

MainViewModelFactory.kt

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

MainViewModel.kt

class MainViewModel(private val repository: Repository):ViewModel() {
val repoResponse:MutableLiveData<Response<Employee>> = MutableLiveData()
fun getEmployeeData(){
    viewModelScope.launch {
        val response = repository.getEmployeeData()
        repoResponse.value = response
    }
}

ApiClient.kt

object ApiClient {
private val retrofit by lazy{
    Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
}

val api:Api by lazy {
    retrofit.create(Api::class.java)
}

Api.kt

public interface Api {

@GET("api/v1/employee/1")
suspend fun getEmployeeData():Response<Employee>
}

Repository.kt

class Repository {
suspend fun getEmployeeData():Response<Employee>{
    return ApiClient.api.getEmployeeData()
}

Employee.kt

data class Employee(
@SerializedName("id")
var employee_id: Int,
@SerializedName("employee_name")
var employee_name: String,
@SerializedName("employee_age")
var employee_age: Int,
@SerializedName("employee_salary")
var employee_salary: Int
)

Constants.kt

class Constants {
companion object{
    const val BASE_URL = "http://dummy.restapiexample.com"
}

Error image enter image description here

How can i solve this? please help me. Thank you

user10997009
  • 142
  • 8

1 Answers1

4

Retrofit only supports suspend keyword since 2.6.4, so using 2.3.0 won't work.

You should update to a newer version of Retrofit. The current latest version at the time of writing is 2.9.0.

EpicPandaForce
  • 79,669
  • 27
  • 256
  • 428
  • now i am facing this error java.net.UnknownServiceException: CLEARTEXT communication to dummy.restapiexample.com not permitted by network security policy – user10997009 Jan 25 '21 at 12:03
  • 1
    @user10997009 that goes to https://stackoverflow.com/questions/45940861/android-8-cleartext-http-traffic-not-permitted – EpicPandaForce Jan 25 '21 at 13:33