我使用LiveData调用适配器进行改造,改编自谷歌样本
public interface ApiService {
@GET("?schema=1.2&form=cjson&byCategories=liveChannels&range=1-500&count=true")
LiveData<ApiResponse<Page<Media>>> getChannels();
}
Run Code Online (Sandbox Code Playgroud)
我必须使用不同的端点,所以我想使ApiResponse通用.ApiResponse将是接口或抽象的,并且对于所有这些端点具有不同的变体; 我不想为扩展ApiResponse的每个类编写不同的LiveData扩展.
我想做的事情如下:
RetrofitLiveData<R, E extends ApiResponse<R>> extends LiveData<E<R>>
Run Code Online (Sandbox Code Playgroud)
(我知道以前的代码不可编译,它只是我想要的一个例子)
然后在改造界面我可以:
LiveData<Endpoint1ApiResponse<Endpoint1Data>>
LiveData<Endpoint2ApiResponse<Endpoint2Data>>
LiveData<Endpoint3ApiResponse<Endpoint3Data>>
public class LiveDataCallAdapterFactory extends CallAdapter.Factory {
@Override
public CallAdapter<?, ?> get(@NonNull Type returnType, @NonNull Annotation[] annotations,
@NonNull Retrofit retrofit) {
if (getRawType(returnType) != LiveData.class) {
return null;
}
Type observableType = getParameterUpperBound(0, (ParameterizedType) returnType);
Class<?> rawObservableType = getRawType(observableType);
if (rawObservableType != ApiResponse.class) {
throw new IllegalArgumentException("type must be a resource");
}
if (! (observableType instanceof ParameterizedType)) { …Run Code Online (Sandbox Code Playgroud)