Android网络框架 - Retrofit基本使用

Retrofit网络框架使用大致可分为三步。
1. 通过RestAdapter生成接口访问对象
2. 定义接口函数,参数和URL通过Annotation指定
3. 实现每个Callback


1. 封装RestAdapter统一接口访问类

public class Server {

    private static ServerApi sServerApi;
    private static Context sContext;

    /**
     * 退出清除信息
     */
    public static void logout() {
        //处理登出逻辑
    }

    /**
     * 服务器接口对象
     *
     * @param context
     * @return
     */
    public static ServerApi getServerApi(final Context context) {
        sContext = context;
        if (sServerApi == null) {
            RestAdapter.Builder builder = initRequestHeader(context, getServer());
            RestAdapter restAdapter = builder.build();
            sServerApi = restAdapter.create(ServerApi.class);
        }
        return sServerApi;
    }

    /**
     * 重置Api,当连接Header内容需要改变时候,必须调用reset方法
     * 登录状态变更时需调用
     */
    public static void resetServerApi() {
        sServerApi = null;
    }


    /**
     * 初始化请求头
     *
     * @param context
     * @param server
     * @return
     */
    private static RestAdapter.Builder initRequestHeader(final Context context, final String server) {
        RequestInterceptor requestInterceptor = null;

        try {

            requestInterceptor = new RequestInterceptor() {
                @Override
                public void intercept(RequestFacade requestFacade) {
                    //添加必要的Head信息
                    requestFacade.addHeader("Authorization", "token");
                    requestFacade.addHeader("app-name", "appName");
                    requestFacade.addHeader("app-version", "appVersion");
                    requestFacade.addHeader("User-Agent", "userAgent");
                }
            };
        } catch (Exception e) {
            e.printStackTrace();
        }

        RestAdapter.Builder builder = new RestAdapter.Builder()
                //设置服务器地址 
                .setEndpoint(server)
                .setClient(new OkClient());

        //控制网络访问日志
        if(BuildConfig.DEBUG) {
            builder.setLogLevel(RestAdapter.LogLevel.FULL);
        } else {
            builder.setLogLevel(RestAdapter.LogLevel.NONE);
        }

        if (requestInterceptor != null) {
            builder.setRequestInterceptor(requestInterceptor);
        }

        return builder;

    }

    public static String getServer() {
        if (Constant.DEBUG) {
            return ServerApi.DEV_SERVER_URL;
        } else {
            return ServerApi.SERVER_URL;
        }
    }
}

2. 定义接口参数和url

public interface ServerApi {

    public static final String SERVER_URL = "http://xxxxx:5000";
    public static final String DEV_SERVER_URL = "http://xxxxx:5000";

    @GET("/test/login")
    void login(@Query("account") String account, Callback callback);

    @POST("/test/upload")
    void uploadInfo(@Body UserInfo info, Callback callback);

    @PATCH("/test/{userid}/detail")
    void getDetail(@Path("userid") String userid, Callback callback);

}

3. 统一Callback

public abstract class Callback<T> implements retrofit.Callback<T> {


    public abstract void onSuccess(T t, Response response);

    public abstract void onFailure(RetrofitError error);

    @Override
    public final void success(T t, Response response) {
        //TODO 统一处理一些事情
        onSuccess(t, response);
    }

    @Override
    public final void failure(RetrofitError error) {
        //TODO 统一处理一些事情
        if (error.getResponse() != null && error.getResponse().getStatus() == 401) {
            Server.logout();       //token过期
            return;
        }
        onFailure(error);
    }

}

4. 使用场景

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            //登录
            case R.id.tv_login:
                login();
                break;
        }

    }

    private void login() {

        Callback callback = new Callback() {
            @Override
            public void onSuccess(ModelA callback, Response response) {
                //dosomething when success
            }

            @Override
            public void onFailure(RetrofitError error) {
                //dosomething when failure
            }

        };

        Server.getServerApi(mContext).login("test", callback);
    }

你可能感兴趣的:(Android)