简体   繁体   中英

Retrofit 2 - How to make request without Call object

I use retrofit 2 and I have UserService with rest methods which return objects Call. I would like to invoke these methods and return just data object.

I have this:

@GET("users")
Call<List<UserDTO>> getUsers();

but I want:

@GET("users")
List<UserDTO> getUsers();

I know that was possible by default in retrofit 1.9 but i couldn't find solution for this problem. I dont want invoke method, execute call, get body and make try..catch every time when I use it.

When I invoke method from my second example I receive error:

Could not locate call adapter for java.util.List<>

Is it possible to handle this case in any adapter? And how to do it?

I resolved this problem like that:

public class CustomCallAdapter<T> implements CallAdapter<T, T> {

    private Type returnType;

    public CustomCallAdapter(Type returnType) {
        this.returnType = returnType;
    }

    @Override
    public Type responseType() {
        return returnType;
    }

    @Override
    public T adapt(Call<T> call) {
        try {
            return call.execute().body();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static class Factory extends CallAdapter.Factory {

        @Override
        public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
            return new CustomCallAdapter(returnType);
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM