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); } }