配置gradle:
//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
def coroutines = "1.3.7"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines"
// ViewModel and LiveData
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
1.创建data class
data class DeviceBean(val errorCode:String, val errorMsg:String, val data:String)
2.retrofit接口类
interface NetService {
//包含三个参数,在接口中直接返回data class,函数名称加suspend供协程调用
@GET("/products/isEnabled")
suspend fun checkDevice(@Query("productName") deviceName:String,@Query("deviceId") deviceId:String,@Query("deviceLocation") deviceLoc:String):DeviceBean
}
3.retrofit初始化,创建服务接口
Retrofit mRetrofit = new Retrofit.Builder()
.client(okHttpBuilder.build())
.baseUrl(baseUrl) //设置网络请求的Url地址
.addConverterFactory(GsonConverterFactory.create())
.build();
val netService:NetService = mRetrofit.create(NetService::class.java);
4.在协程中调用网络接口(此处省略了部分协程及viewmodel相关的代码)
val data = netService.checkDevice(type,it,country)//直接调用接口,获取结果
liveData.postValue(data)//viewmodel中保存的livedata对象,用于界面观察数据变化;此处省略了部分相关代码
至此协程中使用retrofit查询网络接口相关代码基本完成,执行得到如下异常:
java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of 'java.lang.invoke.LambdaMetafactory' appears in /apex/com.android.runtime/javalib/core-oj.jar)
解决:
查阅资料后发现新版本需要使用Jdk1.8版本
minSdkVersion至少为21,Android Gradle插件版本至少为3.2
还需要将Java版本设置为1.8或更高版本。在源代码中使用Java 8功能(lambdas)
在gradle中加入以下配置:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
重新编译运行,执行结果成功
记录下,方便下次再遇见相同问题时可以查看