Kotlin使用Retrofit2简单实例

效果展示

在这里插入图片描述

接口介绍

接口: 手机号码归属地查询API.
支持格式:JSON
请求方法:GET

步骤:

1. gradle添加依赖库

dependencies {
    ...
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}

2. 创建数据类

在这里插入图片描述

data class Tel(val status: String, val msg: String, val result: Result) {
    data class Result(
        val province: String,       // 省
        val city: String,           // 市
        val company: String,        // 运营商
        val cardtype: String        // 卡类型
    )
}

3. 定义代理接口

interface TelService {

    /**
     * @Parent: appkey: 调用的密钥      shouji: 查询的手机号
     */
    @GET("shouji/query")
    fun SerachTelByGet(@Query("appkey") appkey: String, @Query("shouji") shouji: String): Call<Tel>
}

4.Retrofit构造器

//单例类
object ServiceCreator {
    private const val BASE_URL = "https://api.binstd.com"       //根路径

    private val retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())     //添加用于解析数据的转换库
        .build()

    fun <T> create(serviceClass: Class<T>): T = retrofit.create(serviceClass)
}

调用

package com.example.serachtel

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class MainActivity : AppCompatActivity() {
    private val appkey = "注册后即可获取"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        requestGetBtn.setOnClickListener {
            val telNumber = inputTelEt.text.toString()	//从EditText获取输入的手机号
            val telService = ServiceCreator.create(TelService::class.java)  //传入之前定义的接口

			//Get请求并处理结果
            telService.SerachTelByGet(appkey, telNumber).enqueue(object : Callback<Tel> {
                override fun onFailure(call: Call<Tel>, t: Throwable) {
                    t.printStackTrace()
                }

                override fun onResponse(call: Call<Tel>, response: Response<Tel>) {
                    val tel = response.body()
                    if (tel != null) {
                        infoTv.text = "${tel.result.province}   ${tel.result.city}"
                    }
                }
            })
        }
    }
}

最后注意

1
网络权限

<uses-permission android:name="android.permission.INTERNET" />

2
我编译时报错Error: Invoke-customs are only supported starting with Android O (–min-api 26)
原因:代码未设置支持Java8

解决方法:在app的build.gradle添加如下代码

android {
   	...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值