Kotlin Android 第21天,从 0 到 ML - Retrofit and Repository

前言:

  说到呼叫 API 的方法,那就一定会提到 Retrofit 这个无人不知,无人不晓的第三方的套件, 适用於 Android 和 Java 的类型安全HTTP 客户端,功能强大且完整,好写和好维护呀,废话不多就用下去吧。
    

大纲 :

终於谈到了Retrofit , 那我们就看一下从第15天到第17天的MVVM 架构,综合实作一下吧
https://ithelp.ithome.com.tw/upload/images/20210920/20121643NVv5eDngI2.png

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://ithelp.ithome.com.tw/upload/images/20210926/201216433v0hxs4Z1H.png

参考:

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

>>:  Day11 - 搜寻文章标题

Proxmox VE 安装虚拟机:Windows 10 (二)

前几章中的操作过程中,我们已经可以顺利的将 Windows 10 在虚拟客体机当中安装起来运作,但...

【Day17】数据展示元件 - Infinite scroll

元件介绍 Infinite scroll 能在面对多笔资料时,让卷轴滑动到底部时再载入下一页面的资料...

其他名词解释 | ML#Day23

承上一篇,模型训练完成之後的那些Vertex列出评估函数,除了R^2也一并介绍剩下的名词。 MAE ...

[想试试看JavaScript ] 函式 回传值

函式 回传值 函式还有一个设定叫做回传值,回传值可以做什麽呢? 就是当我函式计算完之後,我想将函式计...

[DAY 29] Edge Computing v.s PC Computing

前言 我们知道了如何在个人电脑上执行训练/使用一个 Deep Learning Model ,更进一...