Android 协程-retrofit

导入 #

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)  
                }  
  
            })  
        }  
    }  
  
}