导入 #
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.6.1'
implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
}
第一个协程 #
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
getAppDataBtn.setOnClickListener {
val retrofit = Retrofit.Builder()
.baseUrl("http://10.0.2.2/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val appService = retrofit.create(AppService::class.java)
appService.getAppData().enqueue(object : Callback<List<App>> {
override fun onResponse(call: Call<List<App>>,
response: Response<List<App>>) {
val list = response.body()
if (list != null) {
for (app in list) {
Log.d("MainActivity", "id is ${app.id}")
Log.d("MainActivity", "name is ${app.name}")
Log.d("MainActivity", "version is ${app.version}")
}
}
}
override fun onFailure(call: Call<List<App>>, t: Throwable) {
t.printStackTrace()
}
})
}
}
}
定义接口 #
interface AppService{
//静态
@GET("get_data.json")
fun getData(): Call<Data>
//动态参数
@GET("page/{page}/get_data.json")
fun getPageData(@Path("page") page:Int): Call<Data>
//get 带参数
@GET("user/login")
fun login(@Query("username") username:String,@Query("password") password:String): Call<ResponseBody>
//post
@POST("user/login")
fun login(@Body data:Data): Call<ResponseBody>
//指定静态header呢
@Header("sign: 123")
//动态Header
@POST("user/login")
fun login(@Header("sign") sign:String,@Body data:Data): Call<ResponseBody>
}
论Retrofit构建起的最佳写法 #
先写一个ServiceCretaor单例类
object ServiceCreator{
private const val BASE_URL = "http://10.0.2.2/"
private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
fun <T> create(serviceClass: Class<T>): T = retrofit.create(serviceClass)
inline fun <reified T> create(): T = create(T::class.java)
}
使用
object SmartCityNetwork {
private val studentService = ServiceCreator.create(StudentService::class.java)
suspend fun studentLogin(studentNumber:String, password:String)= studentService.studentLogin(studentNumber,password).await()
private suspend fun <T> Call<T>.await():T{
return suspendCoroutine {
enqueue(object : Callback<T> {
override fun onResponse(call: Call<T>, response: Response<T>) {
val body=response.body()
if(body!=null) it.resume(body)
else it.resumeWithException(RuntimeException("response body is null"))
}
override fun onFailure(call: Call<T>, t: Throwable) {
it.resumeWithException(t)
}
})
}
}
}