[안드로이드] 네트워크-Retrofit(Coroutine)

나고수·2021년 9월 7일
0

andriod

목록 보기
6/27
post-thumbnail
post-custom-banner

Retrofit을 Coroutine으로 비동기적으로 사용해서 서버와 데이터 주고받기 실습

//RetrofitCoroutineActivity.kt

class RetrofitCoroutineActivity : AppCompatActivity() {
    private lateinit var binding: ActivityRetrofitCoroutineBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityRetrofitCoroutineBinding.inflate(layoutInflater)
        setContentView(binding.root)

        //https://jsonplaceholder.typicode.com/posts
        val retrofit = Retrofit.Builder()
            .baseUrl("https://jsonplaceholder.typicode.com/") // 바뀌지 않는 api
            .addConverterFactory(GsonConverterFactory.create()) //josn to gson
            .build()

        val service = retrofit.create(RetrofitService2::class.java)

//runblocking안에서 코루틴을 실행한다.

        //get
        val job = runBlocking {
            val response = service.getPersonList()
            if (response.isSuccessful) {
           //retorifit을 builder할 때 addConverterFactory를 설정해줬으므로 
           //그냥 response를 RetrofitService interface에서 정의한 리턴값대로 자유롭게 쓰면 되는 듯 
           //(여기서는 ArrayList<Person>)
                Log.e("retrofitTest", response.body()!![0].title.toString())
            }
        }

        //post
        val job2 = runBlocking {
            val person = Person(100, "test3", "body3")
            val response = service.postPersonList(person)
            if (response.isSuccessful) {
                Log.e("retrofitTest", response.body()!!.title.toString())
            }
        }

    }
}
//RetrofitService2.interface

interface RetrofitService2 {
    //baseurl 뒷부분
    @GET("posts")
    //코루틴 안에서 실행할 함수는 suspend 함수여야 함
    //콜백으로 비동기를 실행할때와는 다르게, 리턴값은 Response<받는타입> 이다.
    suspend fun getPersonList(): Response<ArrayList<Person>>

    @POST("posts")
    suspend fun postPersonList(
        @Body person: Person
    ): Response<Person>

}
//Person.kt

class Person (
    var userId : Int?= null,
    var title : String? = null,
    var body : String? = null
        ):Serializable{
            constructor(id: Int) : this()
}
profile
되고싶다
post-custom-banner

0개의 댓글