okhttp简单封装

NetworkManager管理客户端网络请求

  • 1.初始化OkHttpClient对象,配置请求相关设置。
  • 2.使用根据url和参数创建Request对象。
  • 3.使用OkHttpClient.newCall,传入Request对象,创建call对象,并执行同步或者异步请求。

    /**
    * NetworkManager 持有一个OkHttpClient对象来发送网络请求,处理网络结果的线程的切换
    * */
    
    public class NetworkManager {
    
    public static final String TAG = "NetworkManager";
    
    public static NetworkManager sNetworkManager;
    
    private Handler mHandler = new Handler(Looper.getMainLooper());
    
    private NetworkManager() {
        mOkHttpClient = new OkHttpClient();
    }
    
    private OkHttpClient mOkHttpClient;
    
    public static NetworkManager getInstance() {
        if (sNetworkManager == null) {
            synchronized (NetworkManager.class) {
                if (sNetworkManager == null) {
                    sNetworkManager = new NetworkManager();
                }
            }
        }
        return sNetworkManager;
    }
    
    public void sendRequest(final BaseRequest baseRequest) {
        final Request request = new Request.Builder().url(baseRequest.getUrl()).get().build();
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        baseRequest.getNetworkListener().onFailed(e.getLocalizedMessage());
                    }
                });
            }
    
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //解析结果在在子线程做
                final Object o = baseRequest.parseNetworkResponse(response.body().string());
                //回调网络请求成功,传入解析后的结果
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        baseRequest.getNetworkListener().onSuccess(o);
                    }
                });
            }
        });
    }}
    

BaseRequest 请求对象

  • 1.所有的Request都有url、参数和callback,在BaseRequest中定义。
  • 2.执行网络请求获得network对象的请求方法,将this传入。
  • 3.可以解析响应对象,通过Gson和泛型。

    /**
     * 包含一个请求所需必要的信息url, 调用NetworkManager发送请求,解析网络结果,解析发送请求时想要的java bean
     * 还可以提供回调方法
     * @param <T>
     */
    public class BaseRequest<T> {
        public static final String TAG = "BaseRequest";
    
        public static final int DEFAULT_PAGE_SIZE = 10;
    
        private String mUrl;
        private NetworkListener mNetworkListener;
    
        private Gson mGson;
    
        public String getUrl() {
            return mUrl;
        }
    
        public void setUrl(String url) {
            mUrl = url;
        }
    
        public NetworkListener getNetworkListener() {
            return mNetworkListener;
        }
    
        public void setNetworkListener(NetworkListener networkListener) {
            mNetworkListener = networkListener;
        }
    
        public BaseRequest(String url, NetworkListener listener) {
            mUrl = url;
            mNetworkListener = listener;
            mGson = new Gson();
        }
    
        public void execute() {
            NetworkManager.getInstance().sendRequest(this);
        }
    
        /**
         * 解析网络结果,解析发送请求时想要的java bean
         * @param string
         * @return
         */
        public T parseNetworkResponse(String string) {
            Class classz = getClass();
            Type genericSuperclass = classz.getGenericSuperclass();
            ParameterizedType parameterized = (ParameterizedType) genericSuperclass;
            return mGson.fromJson(string, parameterized.getActualTypeArguments()[0]);
        }
    
    
        <------------------------>
    
        public interface NetworkListener<T> {
    
        void onFailed(String s);
    
        /**
         * 回调解析后的结果
         * @param result
         */
        void onSuccess(T result);
        }
    }
    

具体ChileRequest

  • 1.继承BaseRequest
  • 2.只需要闯入自己请求的参数,设置请求的url
  • 3.将请求信息传递给BaseRequest

    public class HomeRequest extends BaseRequest<List<HomeListItemBean>> {
    public static final String TAG = "HomeRequest";
    
    public HomeRequest(String url, NetworkListener listener) {
        super(url, listener);
    }
    
    public static HomeRequest getHomeRequest(int offset, NetworkListener listener) {
        return new HomeRequest(URLProviderUtils.getHomeUrl(offset, DEFAULT_PAGE_SIZE), listener);
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值