android - java.lang.NoClassDefFoundError : com. example.api.retrofit.AuthenticationInterceptor$拦截$1

标签 android kotlin retrofit2 interceptor okhttp

我最近在我的应用程序中添加了 retrofit2。它在运行 Android 8.0 的 Nexus 6P 上运行良好,但在运行 Android 6.0.1 的旧 OnePlus One 上测试时,我遇到了错误:

java.lang.NoClassDefFoundError: com.example.api.retrofit.AuthenticationInterceptor$intercept$1
    at com.example.api.retrofit.AuthenticationInterceptor.intercept(AuthenticationInterceptor.kt:21)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:185)
    at okhttp3.RealCall.execute(RealCall.java:69)
    at retrofit2.OkHttpCall.execute(OkHttpCall.java:180)
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:91)
    at com.example.fragment.xx.XXFragment$onViewCreated$2.getItemsForConstraint(XXFragment.kt:53)
    at com.example.view.MyAutoCompleteTextView$Adapter$getFilter$1.performFiltering(MyAutoCompleteTextView.kt:114)
    at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.os.HandlerThread.run(HandlerThread.java:61)

这是我的代码:

构建.gradle

buildscript {
    ext {
        okhttpVersion = '3.8.0'
        retrofitVersion = '2.3.0'
    }
...
}

应用程序/build.gradle:

compile "com.squareup.okhttp3:okhttp:$okhttpVersion"
compile "com.squareup.okhttp3:logging-interceptor:$okhttpVersion"
compile 'com.google.code.gson:gson:2.8.1'
compile("com.squareup.retrofit2:retrofit:$retrofitVersion") {
    exclude module: 'okhttp'
}
compile "com.squareup.retrofit2:converter-gson:$retrofitVersion"

构建服务:

OkHttpClient client = new OkHttpClient().newBuilder()
        .addInterceptor(new AuthenticationInterceptor(ctx))
        .addInterceptor(new HttpLoggingInterceptor()
                .setLevel(HttpLoggingInterceptor.Level.BODY))
        .build();
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(HOST + VERSION + "/")
        .client(client)
        .addConverterFactory(new EnvelopingConverter())
        .addConverterFactory(GsonConverterFactory.create())
        .build();
retrofitService = retrofit.create(ApiService.class);

拦截器:

import android.content.Context
import com.example.api.Api
import com.example.controller.AuthManager
import okhttp3.Interceptor
import okhttp3.Response

class AuthenticationInterceptor(val context: Context) : Interceptor {
    override fun intercept(chain: Interceptor.Chain?): Response? {
        var request = chain?.request()
        val headers = AuthManager.getAuthHeaders(context)

        if (request != null) {
            val requestBuilder = request.newBuilder()
            requestBuilder.addHeader(Api.HEADER_ACCEPT, Api.HEADER_APP_JSON)

            headers.forEach { key, value ->  // this is line 21
                requestBuilder.addHeader(key, value)
            }

            request = requestBuilder.build()
        }

        return chain?.proceed(request)
    }
}

我不确定可能是什么问题?有人有什么想法吗?

更新:

用java写的拦截器,好像可以用。为什么?对于这个项目,我真的很想坚持使用 Kotlin。

public class AuthInterceptor implements Interceptor {
    private Context context;

    public AuthInterceptor(Context ctx) {
        context = ctx;
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Map<String, String> headers = AuthManager.getAuthHeaders(context);
        if (request != null) {
            Request.Builder requestBuilder = request.newBuilder();
            requestBuilder.addHeader(Api.HEADER_ACCEPT, Api.HEADER_APP_JSON);
            for (String key : headers.keySet()) {
                requestBuilder.addHeader(key, headers.get(key));
            }
            request = requestBuilder.build();
        }
        return chain.proceed(request);
    }
}

最佳答案

尝试禁用 Instant Run。

1 2 3

关于android - java.lang.NoClassDefFoundError : com. example.api.retrofit.AuthenticationInterceptor$拦截$1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46486395/

相关文章:

java - Android - 多功能异步任务返回数据

java - 减少应用程序传送的 Realm 数据库的大小

kotlin - 创建片段后更改AR session 配置

java - retrofit / Dagger - Android : Fatal Exception: API declarations must be interfaces

android - 选择墙纸并突出显示墙纸区域的 Intent

android - 如何解决由 : java. nio.file.NoSuchFileException : app/build/intermediates/external_libs_dex/release/out while signing apk? 引起的问题

使用不同服务类的 Spring Boot 测试

java - 改造后参数

spring-boot - 同一应用程序无法通过Docker Compose发送HTTP请求

android - 使用 colorAccent 属性的资源 NotFoundException getColor()