Android Studio 2.3构建报错:RxCallAdapterWrapper构造方法未定义
Hey there, let's work through this issue you're facing after downgrading your project to Android Studio 2.3 and Gradle 3.3. The error about the undefined constructor for RxCallAdapterWrapper typically stems from version mismatches between Retrofit/RxJava dependencies and your custom call adapter, or incorrect generic handling. Here's how to fix it:
1. Align Retrofit & RxJava Dependency Versions
Since you've downgraded your build tools, you need to make sure your Retrofit and RxJava versions are compatible with Gradle 3.3 and Android Studio 2.3. For this setup, Retrofit 2.3.0 is a stable match. Update your app-level build.gradle dependencies:
dependencies { // Retrofit core compile 'com.squareup.retrofit2:retrofit:2.3.0' // RxJava 1 adapter (use adapter-rxjava2 if you're on RxJava 2) compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0' // RxJava 1 (adjust to rxjava2:2.1.10 if using RxJava 2) compile 'io.reactivex:rxjava:1.3.8' // Optional: Gson converter if you use JSON parsing compile 'com.squareup.retrofit2:converter-gson:2.3.0' }
2. Fix the RxCallAdapterWrapper Constructor & Generic Types
The error indicates a mismatch in constructor parameters or generic type capture. Update your RxErrorHandlingCallAdapterFactory class to ensure the RxCallAdapterWrapper constructor matches the expected signature, and generic types are properly defined:
Example Corrected Code:
public class RxErrorHandlingCallAdapterFactory extends CallAdapter.Factory { private final RxJavaCallAdapterFactory original; private RxErrorHandlingCallAdapterFactory() { original = RxJavaCallAdapterFactory.create(); } public static RxErrorHandlingCallAdapterFactory create() { return new RxErrorHandlingCallAdapterFactory(); } @Override public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) { CallAdapter<?, ?> delegate = original.get(returnType, annotations, retrofit); // Explicit cast to resolve generic capture mismatch return new RxCallAdapterWrapper(retrofit, (CallAdapter<Object, Observable<?>>) delegate); } private class RxCallAdapterWrapper implements CallAdapter<Object, Observable<?>> { private final Retrofit retrofit; private final CallAdapter<Object, Observable<?>> delegate; // Ensure this constructor matches exactly what's being called public RxCallAdapterWrapper(Retrofit retrofit, CallAdapter<Object, Observable<?>> delegate) { this.retrofit = retrofit; this.delegate = delegate; } @Override public Type responseType() { return delegate.responseType(); } @Override public Observable<?> adapt(Call<Object> call) { return delegate.adapt(call) .onErrorResumeNext(throwable -> { // Your custom error handling logic here return Observable.error(handleError(throwable)); }); } private Throwable handleError(Throwable throwable) { // Implement your error parsing/handling logic return throwable; } } }
Key fixes here:
- We explicitly cast the delegate to
CallAdapter<Object, Observable<?>>to resolve the generic capture error mentioned in your stack trace. - The constructor now accepts exactly a
Retrofitinstance and aCallAdapterwith matching generics, matching the signature your build is looking for.
3. Verify Dagger 2 Compatibility
Since you downgraded due to Dagger 2 plugin issues, ensure your Dagger 2 versions are compatible with Android Studio 2.3. Use these stable versions in your build.gradle:
dependencies { compile 'com.google.dagger:dagger:2.11' annotationProcessor 'com.google.dagger:dagger-compiler:2.11' // If using Android-specific injection compile 'com.google.dagger:dagger-android:2.11' compile 'com.google.dagger:dagger-android-support:2.11' annotationProcessor 'com.google.dagger:dagger-android-processor:2.11' }
Note: Use annotationProcessor instead of the old apt plugin, as Android Studio 2.3 supports annotation processors natively.
4. Clean & Rebuild Your Project
Migration can leave cached build artifacts that cause unexpected issues. Perform these steps:
- Go to Build > Clean Project
- Then Build > Rebuild Project
- Optionally, delete the
.gradlefolder in your project root and thebuildfolders in your app module, then sync your project with Gradle files.
5. Enable Java 8 Support (If Needed)
If your code uses Java 8 features like lambdas, add this to your app-level build.gradle under the android block:
android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
内容的提问来源于stack exchange,提问作者Manjushree Shinde

