Android kotlin協程 使用retrofit時出現的異常:java.lang.NoSuchMethodError: No static method metafactory
阿新 • • 發佈:2021-01-16
配置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
}
重新編譯執行,執行結果成功
記錄下,方便下次再遇見相同問題時可以檢視