小编Cri*_*aru的帖子

改造,实时数据适配器,使响应类包装器通用?

我使用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)

java generics android retrofit2 android-livedata

8
推荐指数
1
解决办法
1271
查看次数

标签 统计

android ×1

android-livedata ×1

generics ×1

java ×1

retrofit2 ×1