说到呼叫 API 的方法,那就一定会提到 Retrofit 这个无人不知,无人不晓的第三方的套件, 适用於 Android 和 Java 的类型安全HTTP 客户端,功能强大且完整,好写和好维护呀,废话不多就用下去吧。
终於谈到了Retrofit , 那我们就看一下从第15天到第17天的MVVM 架构,综合实作一下吧
build.gradle(app)
dependencies {
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation "com.squareup.okhttp3:logging-interceptor:4.0.1"
implementation "com.squareup.okhttp3:okhttp:4.9.0"
}
AndroidManifet.xml 宣告 INTERNET 权限
<uses-permission android:name="android.permission.INTERNET" />
建立Interface
interface FindWcApi {
@GET("{mLocal}?format=json&limit=5&api_key="+ API_KEY)
suspend fun getToilet( @Path(value = "mLocal") Local:String,@Query(value = "filters") Latitude:String, @Query(value = "filters") Longitude:String): Response<ToiletData>
companion object {
const val OPENDATA_URL = "https://data.epa.gov.tw/api/v1/"
const val API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
建立Repository
class FindWcRepository(Local:String = "fac_p_07", Latitude:Double=24.9XXXX, Longitude:Double=121.5XXXX9) {
private val findWcApi: FindWcApi
var mLocal = Local
var mLatitude = Latitude
var mLongitude = Longitude
public val mApiInfo = ApiInfo(mLocal,mLatitude,mLongitude)
init {
val loggingInterceptor = HttpLoggingInterceptor()
println(loggingInterceptor.toString())
loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
val okHttpClientBuilder = OkHttpClient.Builder().addInterceptor {
// This open API does not require any headers. This would be the
// place to add headers for APIs that, for example require an API key.
it.proceed(it.request().newBuilder().build())
}
val retrofit = Retrofit.Builder()
.baseUrl(FindWcApi.OPENDATA_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClientBuilder.build())
.build()
findWcApi = retrofit.create(FindWcApi::class.java)
}
fun getToiletData(block: suspend (ToiletData) -> Unit) {
runBlocking {
val response = findWcApi.getToilet(mLocal,"Latitude,LE,"+mLatitude,"Longitude,LE,"+mLongitude)
val result = response.body()
result?.let {
block(it)
}
}
}
}
**viewModel **
class Day21ViewModel:ViewModel() {
var toiletInfo = MutableLiveData<String>()
var toiletInfoResult: String = "查询中"
fun getToiletInfo() {
FindWcRepository().getToiletData {
//var toiletInfo:String = ""
if(!it.records.isEmpty()) {
for(item in it.records.indices) {
toiletInfoResult= toiletInfoResult+"公厕名称: "+it.records.get(item).Name + " 公厕地址: " + it.records.get(item).Address+"\n"
}
}else{
toiletInfoResult = "找不到资料或是资料有误,如果还要找其他地方,请再问一次请问厕所在哪里"
}
toiletInfo.postValue(toiletInfoResult)
}
}
}
Activity
viewModel = ViewModelProvider(this).get(Day21ViewModel::class.java)
viewModel.toiletInfo.observe(this){
binding.TextviewResult.text = it
}
//onClick
fun findwc(view: View) {
viewModel.getToiletInfo()
}
执行结果:
https://square.github.io/retrofit/
https://developer.android.com/jetpack
https://developer.android.com/topic/libraries/architecture/viewmodel
https://developer.android.com/topic/libraries/architecture/livedata
<<: 110/11 - 把照片储存在Pictures/应用程序名称资料夹 - 1
前几章中的操作过程中,我们已经可以顺利的将 Windows 10 在虚拟客体机当中安装起来运作,但...
元件介绍 Infinite scroll 能在面对多笔资料时,让卷轴滑动到底部时再载入下一页面的资料...
承上一篇,模型训练完成之後的那些Vertex列出评估函数,除了R^2也一并介绍剩下的名词。 MAE ...
函式 回传值 函式还有一个设定叫做回传值,回传值可以做什麽呢? 就是当我函式计算完之後,我想将函式计...
前言 我们知道了如何在个人电脑上执行训练/使用一个 Deep Learning Model ,更进一...