1. 程式人生 > 其它 >Android kotlin協程 使用retrofit時出現的異常:java.lang.NoSuchMethodError: No static method metafactory

Android kotlin協程 使用retrofit時出現的異常:java.lang.NoSuchMethodError: No static method metafactory

技術標籤:androidandroid

配置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

}

重新編譯執行,執行結果成功

記錄下,方便下次再遇見相同問題時可以檢視