2016-10-24 18 views
0

私はCall<T>のカスタム実装を作成しました。ここにカスタムコードのないカスタムクラスがあります。Retrofit:原因:java.lang.IllegalArgumentException:CustomClass用のコールアダプタを見つけることができません

public class CachedCall<T> implements Call<T> { 

private final Call<T> delegate; 

public CachedCall(Call<T> delegate) { 
    this.delegate = delegate; 
} 

@Override 
public Response<T> execute() throws IOException { 
    return delegate.execute(); 
} 

@Override 
public void enqueue(Callback<T> callback) { 
    delegate.enqueue(callback); 
} 

public void enqueueWithCache(final CachedCallback<T> callback) { 
    delegate.enqueue(callback); 
} 

@Override 
public boolean isExecuted() { 
    return delegate.isExecuted(); 
} 

@Override 
public void cancel() { 
    delegate.cancel(); 
} 

@Override 
public boolean isCanceled() { 
    return delegate.isCanceled(); 
} 

@Override 
public Call<T> clone() { 
    return new CachedCall<>(delegate.clone()); 
} 

@Override 
public Request request() { 
    return delegate.request(); 
} 

}

そして、私のApiServiceに、私は私のコールの一部でこのカスタム実装を使用し、他のいくつかの、exemple上のデフォルト1:

public interface APIService { 

@GET("categories") 
Call<List<Categorie>> categories(@Query("tag") String tag); 

@GET("categories/{categorie}/quotes") 
CachedCall<List<Gif>> gifs(@Path("categorie") String categorie); 

メソッドを持ちますカスタムが呼び出されました。クラッシュしました:

Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for CustomClass. 
                   Tried: 
                    * retrofit2.adapter.rxjava.RxJavaCallAdapterFactory 
                    * retrofit2.ExecutorCallAdapterFactory 
                    at retrofit2.Retrofit.nextCallAdapter(Retrofit.java:237) 
                    at retrofit2.Retrofit.callAdapter(Retrofit.java:201) 
                    at retrofit2.ServiceMethod$Builder.createCallAdapter(ServiceMethod.java:232) 
                    ... 21 more 

カスタム実装を登録する必要がありますか?え?

+0

RxJava2を使用していますか? – Raghunandan

+0

ノップ、私はしません。問題を解決するために ".addCallAdapterFactory(RxJavaCallAdapterFactory.create())"を追加すると答えたが、うまくいきませんでした。 – Dimillian

+0

あなたは改造サービスコールを投稿できますか? – Raghunandan

答えて

1

私自身の問題を解決しました。

あなたがあなた自身のCallAdapter.Factoryを作成して登録する必要があります:あなたはレトロフィットインスタンスを作成するときにそれを登録し、その後

public class CachedCallAdapterFactory extends CallAdapter.Factory { 

final Executor callbackExecutor; 

public CachedCallAdapterFactory(Executor callbackExecutor) { 
    this.callbackExecutor = callbackExecutor; 
} 

@Override 
public CallAdapter<Call<?>> get(final Type returnType, final Annotation[] annotations, final Retrofit retrofit) { 
    if (getRawType(returnType) != CachedCall.class) { 
     return null; 
    } 
    final Type responseType = getParameterUpperBound(0, (ParameterizedType) returnType); 
    return new CallAdapter<Call<?>>() { 
     @Override public Type responseType() { 
      return responseType; 
     } 

     @Override public <R> Call<R> adapt(Call<R> call) { 
      return new CachedCall<>(callbackExecutor, call, responseType, retrofit, annotations); 
     } 
    }; 
} 

}

そして:

 retrofit = new Retrofit.Builder() 
      .client(client) 
      .baseUrl(URL) 
      .addCallAdapterFactory(new CachedCallAdapterFactory(new DefaultExecutor())) 
      .build(); 

あなたDefaultExecutorがちょうど必要実行するにはRunnable

private class DefaultExecutor implements Executor { 

    @Override 
    public void execute(@NonNull Runnable runnable) { 
     runnable.run(); 
    } 
} 
+0

また、更新されたgithubリポジトリhttps://github.com/square/retrofit/blob/master/samples/src/main/java/com/example/retrofit/ErrorHandlingAdapter.javaでも同様のサンプルがあります。 – Raghunandan

関連する問題